详细聊聊关于sql注入的一些零散知识点

 更新时间:2021年10月19日 08:28  点击:2156

零、本文涉及知识点

sqlmap写一句马的具体过程

堆叠注入

union injection(联合注入)

常见的注入绕过姿势

sql注入预编译与常见绕过姿势

一、sqlmap写一句马的过程(-- os-shell)

1.1 简述过程

先写一个文件上传的文件,名字为“ tmpujhum.php ”。

然后通过这个文件上传的木马,将shell(tmpbcluy.php)上传,

执行命令的木马名字为“ tmpbcluy.php ”

具体过程可以参考: https://xz.aliyun.com/t/7942

1.2 一个小问题

都可以直接通过命令写文件了,为什么还要先写一个上传文件的木马,在通过这个木马上传一句马?

*答:**

sqlmap官方这么写得代码,所在按照这个流程,开玩笑~~

主要原因是大多数waf的对命令直接写文件的监控比上传木马的监控严格。

即通过这种“多此一举”的思路,可以提高上传成功一句马的概率

二、堆叠注入:

2.1 什么是堆叠注入

在SQL中,分号(;)是用来表示一条sql语句的结束。

试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?

因此这个想法也就造就了堆叠注入。

2.2 如何判断存在堆叠注入?

~“ id=1 ”正常

~试试“ id=1a ”,假设报错,说明数据没有被强转

~在试试“ id=1; ”假设没有报错,说明“;”没有被代入查询,而是当做了sql语句的结束符

~此时,此位置大概率存在堆叠注入

2.3 局限性

  堆叠注入的局限性在于并不是每一个环境下都可以执行, 

  可能受到API或者数据库引擎不支持的限制, 

  当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

三、union injection(联合注入)

3.1 原理

绝大多数的sql注入都是利用的此姿势,

详细不在赘述,可以直接参考之前的文章。

3.2 与堆叠注入的区别

区别就在于union 或者union all执行的语句类型是有限的,仅仅可以用来执行查询语句,

而堆叠注入可以执行的是任意的语句。

**例如以下这个例子,即堆叠可以执行成功,联合注入不能成功**

用户输入:1; DELETE FROM products服务器端生成的sql语句为:

  Select * from products where productid=1;DELETE FROM products

当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

四、常见的sql注入绕过姿势

4.1 Waf特性:

 绝大多数的waf都是通过正则匹配过滤/拦截请求

 一般一个waf会同时上线N个规则,这些规则同时生效的情况下,仅仅饶过一个依旧会被拦截

4.2 绕waf的核心思路:

 绕过waf正则匹配规则的同时,注入的sql语句可以被正常解析执行。

4.3 常见的思路

数据上:

  大小写           、、很老的waf可以绕过

  加解密、编码解码

  等价函数         union select == union all select

  特殊符号

  反序列化

  注释符混用       、、mysql特性:   

                   database/**/() == database()  

                   内联注释,如/*一个sql版本号sql执行内容*/,具体不在展开      

方式:

 更改提交方式      、、部分waf默认仅仅检测get(但是假设后端不接收post也没什么卵用);

 变异

其他:

  FUZZ        

    、、模糊测试,使用脚本/工具生成大量payload,直接爆破waf,看看哪些语句可以过waf  

  数据库特性

    、、mysql特性:

      union%23a%0Aselect 1,2,3#

    == union#a(换号)select 1,2,3#  

    == union select 1,2,3#

        、、mysql特性:

       /*!select * from users*/ 会正常执行

  垃圾数据溢出

  HTTP参数污染   

      、、多个参数的情况下,一般默认取最后一个  

                、、?id=1/**&id=-1%20union%20select%201,2,3%23*/  

                   即“ 1/**-1 union select 1,2,3#*/ ”

                在mysql之中“ /** 内容不会执行  */ ”所以WAF认为是安全的,

    但是因为Apache的特性,

                      其最终接收的参数为:“ -1 union select 1,2,3#*/ ”

  静态资源        

      、、即本来为php?id=1   改为  php/a.txt(b.js等)?id=1  

       结果不受影响,但是可以过一些老waf

用注释配合参数污染绕waf的成功率是比较高的     

使用sqlmap注意,

~UA自带的要改一下,参数就可以改,可以改为百度等搜索引擎的UA

~可以设置绕waf脚本来提高成功率,而且脚本写也挺简单

~自己测试的时候,可以用参数将sqlmap的流量代理到burp,然后对比自己正常浏览器的流量,看看区别

~必要的时刻,连接代理池直接暴力配合开干

五、Sql注入预编译与常见绕过姿势

5.1 概述

预编译一般在Java的框架中使用,在提高sql语句效率的同时也可以拦截掉很多注入的情况,

但是仍可以被绕过的,

5.2 具体方式

5.2.1 ASC/DESC

应用场景:

当应用显示多条数据时,通常可以选择正向排序或者逆向排序,此时就会用到 ASC/DESC

ASC/DESC 是SQL语句中影响语义的关键字,是不能用单引号引起来的

假设ASC/DESC是接收的前端传入,即存在被注入的风险。

如何处理:

比较安全的方式是使用白名单,排序方式也只有两种,可使用简单的条件判断语句

<?php
 if($_POST['order'] === 'DESC'){
        $order = 'DESC';
    }else{
        $order = 'ASC'
    }

5.2.2 表名/字段名

应用场景:

表名与列名是不能被预编译的,这是由于在预编译生成语法树的过程中,

预处理器在检查解析后的语法树时,会确定数据表和数据列是否存在,

此两者必须为具体值,不能被占位符 ? 所替代

假设表名/字段名是接收的前端传参,即存在被注入的风险

如何处理:

参考下边order by的情况

5.2.3 order by

order by 用来指定某个字段作为排序依据,前面也解释了字段名不能使用预编译

假设order by后边的字段是接收的前端传参,即存在被注入的风险

具体的一些绕过方法可以搜索“ case when ”

如何处理:

为了避免直接拼接SQL语句,可以将列名定义为常量,

再通过白名单的方式进行拼接,能够有效防止SQL注入

当然,这里也可以单独对传入的语句配合正则匹配过滤,但是效果不如这种方式简洁有效。

前端表单:

  <form action="" method="post">
      <select name="order">
          <option value="0">id</option>
          <option value="1">name</option>
          <option value="2">age</option>
      </select>
      <input type="submit" name="submit">
  </form>

白名单函数:

  <?php
      $i = $_POST['order'];
   switch($i){
          case 0:
              $order = "id";
              break;
          case 1:
              $order = "name";
              break;
          default:
              $order = "age";
              break;
      }

5.2.4小结:

假设ASC/DESC是接收的前端传入,即存在被注入的风险。

假设表名/字段名是接收的前端传参,即存在被注入的风险

假设order by后边的字段是接收的前端传参,即存在被注入的风险

总结

到此这篇关于sql注入的一些零散知识点的文章就介绍到这了,更多相关sql注入零散知识点内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • ASP/PHP sql注入语句整理大全

    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • PHP防止SQL注入的例子

    防止SQL注入是我们程序开发人员必须要做的事情了,今天我们就来看一篇关于PHP防止SQL注入的例子了,具体的实现防过滤语句可以参考下面来看看吧。 使用prepared以及参...2016-11-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • PostgreSQL TIMESTAMP类型 时间戳操作

    这篇文章主要介绍了PostgreSQL TIMESTAMP类型 时间戳操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-26
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • postgresql 实现多表关联删除

    这篇文章主要介绍了postgresql 实现多表关联删除操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-02
  • Postgresql 如何选择正确的关闭模式

    这篇文章主要介绍了Postgresl 如何选择正确的关闭模式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-18
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • postgresql数据添加两个字段联合唯一的操作

    这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • mysql的3种分表方案

    一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
  • Vscode上使用SQL的方法

    这篇文章主要介绍了Vscode上使用SQL的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-26
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • Centos5.5中安装Mysql5.5过程分享

    这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
  • postgresql重置序列起始值的操作

    这篇文章主要介绍了postgresql重置序列起始值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-04
  • 用VirtualBox构建MySQL测试环境

    宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19