SQL注入-绕过WAF以及一些注入手段

WAF绕过原理

白盒绕过
  熟练的掌握MySQL函数和语法使用方式
  深入了解中间件运行处理机制
  了解WAF防护原理及方法

黑盒测试:(http://www.mottoin.com/86886.html)
一.架构层绕过WAF:
  1. 寻找源站->针对云WAF
  2. 利用同网段->绕过WAF防护区域
  3. 利用边界漏洞->绕过WAF防护区域
二.资源限制角度绕过WAF:
  1. POST大BOOY
三.协议层面绕过WAF的检测:
  1. 协议未覆盖绕过WAf
  *请求方式变换:GET->POST
  *Content-Type变换:application/x-www-form-urlencoded:-> multipart/from-data
  2. 参数污染
四.规则层面的绕过:
主要的绕过方式

  1. SQL注释符绕过
    Level-1: union/**/select
    Level-2: union/aaaa%01bbs/select
    Level-3: union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select
  2. 内连注释:/!xxxx/
  3. 空白符号绕过:
    MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/
    正则的空白符:%09,%0A,%0B,%0D,%20
    Example-1:union%250Cselect
    Example-1:union%25A0select
  4. 函数分隔符号:
    concat%2520(
    concat/**/(
    concat%250c(
    concat%25a0(
  5. 浮点数词法分析:
    select * from users where id=8E0union select
    1,2,3,4,5,6,7,8,9,0
    select * from users where id=8.0union select
    1,2,3,4,5,6,7,8,9,0
    select * from users where id=\Nunion select
    1,2,3,4,5,6,7,8,9,0
  6. 利用error_based进行SQL注入:Error-based SQL注入函数非常容易被忽略
    extractvalue(1,concat(0x5c,md5(3)));
    updatexml(1,concat(0x5d,md5(3)),1);
    GeometryCollection((select * from (select * from
    (select@@version)f)x))
    polygon((select*from (select name_const(version(),1))x))
    linestring()
    multipoint()
    multilinestring()
    multipolygon()
    6. NySQL特殊语法
    select{x table_name}from{x information_schema.tables};

~每一个点都能找到绕过的方法
以注释绕过为例子,开始Fuzz
注释符绕过:
  *先测试最基本的: union/**/select
  *再测试中间引入特殊字:union/aaaa%01bbs/select
  *最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select
最基本的模式:
  union/something/select

大小写绕过
  如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只对整体进行过滤。例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。

常规绕过手段

双写绕过
  如果在程序中设置出现关键字之后替换为空,那么SQl注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。
例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。

编码绕过
可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。
http://tool.chinaz.com/Tools/urlencode.aspx

内联注释绕过
在Mysql中内容注释中的内容可以被当做SQL语句执行。
SQL注入-绕过WAF以及一些注入手段_第1张图片绕过去除注释符的SQL注入
注释符的作用:用于标记某段代码的作用,起到对代码功能的说明作用。但是注释的内容不会被执行。
1 、Mysql中的注释符: --+或–空格 或#
2、多行注释:/!多行注释内容/
对于正常的SQL语句中,注释符起到说明作用的功能。但是对于在利用SQL注入漏洞的过程中,注释符起到闭合单引号、多引号、双引号、但括号、多括号的功能。

去除注释符的代码举例:
preg_replace(mixed $pattern, mixed $replacement,mixed $subject):执行一个正则表达式的搜索和替换。
$pattern:要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组
$subject:要搜索替换的目标字符串或字符串数组
SQL注入-绕过WAF以及一些注入手段_第2张图片此时可以利用注释符被过滤不能成功闭合单引号,换一种思路 利用or ‘1’='1闭合单引号。也可以使用Sqlmap进行安全测试。

绕过过滤and和or的SQL注入
Mysql一些特性:
  1、Mysql中的大小写不敏感,大写和小写一样。
  2、Mysql中的十六进制与URL编码。
  3、符号和关键字替换 and --> &&、or --> ||
  4、内联注释与多行注释 /!内联注释/ /多行注释/。
  5、Mysql中会自动识别URL与Hex编码好的内容。
绕过策略:
  1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。
  2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr
  3、利用符号替代  and–>&&、or–>||

绕过去除空格的SQL注入
编码:hex,urlencode
空格URL编码:
  %0a 新建一行
  %0c 新的一页
  %0d return功能
  %0b TAB键(垂直)
Sqlmap安全检测:
  sqlmap -u “URL” --hex --dbs --batch

绕过去除(union和select)的SQL注入
编码%0a、加入/**/符,union/select大小写、双写等绕过。

宽字节注入
  ASCII占用一个字节,而GB2312、GBK、GB18083、BIG5、Shift_JIS等这些都是常说的宽字节,实际为两个字节。Mysql在使用GBK编码的时候,会认为两个字符为一个汉字。
  例如: %df’ --> %df’ --> %df%5c%27 --> %df和%5c会被认为是一个汉字。
  方法:在注入点后键入%df,然后按照正常的注入流程开始注入Ascii码大于128才能到汉字的范围。
注入测试:
  1、在可能的注入点后键入%df%27,之后进行注入测试。
  2、查看Mysql编码是否为GBK
  3、是否使用preg_replace把单引号替换成’
  4、是否使用addslashes进行转义
  5、是否使用mysql_real_escape_string进行转义
宽字节注入防御:
  1、不使用GBK编码,使用utf-8。宽字节注入不只是gbk,韩文、日文等都是宽字节,都是可能被利用的
  2、使用mysql_real_escape_string,
  mysql_set_charset(‘gbk’, $conn);
  3、可以设置mysql连接参数,character_set_client=binary,使用二进制的形式进行数据的连接。
Sqlmap安全检测:
  sqlmap -u “URL?id=1%df%27” --search --level 3 --risk 1 --thread 10
  sqlmap.py -u"URL" --tamper=unmagicquotes.py

二次注入
二次注入原理:
二次注入,主要分为两步
  第一步:插入恶意数据,第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
  第二步:引用恶意数据,在数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的校验和处理,这样就会造成SQL的二次注入。
  例如:寻找插入数据库并会转义的操作–>输入参数1’ -->参数经过转义函数后1’–>参数进入数据库存储还原为1’ -->寻找另外一处引用这个数据的操作–>将1’从数据库中取出–>取出后直接给变量并带入SQL–>SQL注入触发。
 SQL注入-绕过WAF以及一些注入手段_第3张图片
二次编码注入
urldecode()与php本身处理编码时,两者配合失误,可构造数据消灭
例:如果php代码中使用了urldecode()等编码函数,放在了一个比较尴尬的位置,与php自身编码配合失误。
  id=1%2527 --> id=1%27 --> id=1’ %25 --> %
注入测试:
  1、在可能的注入点后键入%2527,之后进行注入测试
  2、是否使用urldecode函数
  3、urldecode函数是否在转义方法之后。

你可能感兴趣的:(SQL注入)