利用mcp sqlmap 验证漏洞
利用mcp sqlmap 验证漏洞
背景
最近在工作中想要集成AI来帮助运营漏洞检测。之前我已经写过一个 mcp-request
工具,使用MCP协议让AI帮忙发送和验证漏洞,但只能处理简单的漏洞场景。
对于SQL注入这种复杂场景,mcp-request 虽然能实现,但存在明显问题:
现有方案的局限性
- AI智能程度依赖性强:AI需要足够聪明才知道怎么构造注入payload,遇到盲注等复杂场景就束手无策
- 效率极低:AI每次发包都要思考很久,速度贼慢,完全不适合批量检测
- 上下文消耗巨大:复杂的注入测试会产生大量上下文,浪费token且影响性能
解决方案:引入SQLMap重型武器
经过思考,最简单有效的方法就是集成 SQLMap——这个业界最成熟的SQL注入检测工具。
写了一个小 demo 测试 : https://github.com/godzeo/mcp-sqlmap
核心优势
- 检测准确性极高:如果SQLMap能跑出结果,几乎可以100%确定存在注入漏洞
- 执行速度快:相比AI逐个思考payload,SQLMap的快速遍历机制效率高得多(并非所有场景都适合用AI)
- 功能完整性:不仅能检测,还能进行深度利用,如列举数据库名、表名等
技术实现思路
- 架构设计
最初考虑过HTTP streaming的实时通信方式,但实际测试发现SQLMap运行时间较长,经常出现超时问题。
我之前使用过SQLMap的API模式批量扫描,主要处理GET请求,那种场景确实比较简单。
- 核心挑战
但在实际工作场景中面临一个关键问题:需要完整的POST和GET请求支持。
公司环境下的扫描通常携带复杂的鉴权header:
- JWT令牌
- 会话Cookie
- 自定义认证头
- CSRF令牌等
在复现和验证漏洞时,这些认证信息必不可少。
最终方案:-r参数方式
经过多次实验,最稳定可靠的方法是使用SQLMap的 -r 参数读取完整HTTP请求文件:
sqlmap -r request.txt –batch –flush-session
这种方式的优点:
- 完整保留HTTP请求的所有header信息
- 支持POST请求体
- 兼容复杂的认证机制
- 避免URL解析时的信息丢失
- 关键技术细节
HTTP请求格式化挑战
最大的技术难点是在prompt中指导AI正确格式化HTTP请求。这个调试过程花费了大量时间,因为:
- 格式描述困难:很难在prompt中准确描述HTTP请求的标准格式
- header完整性:必须包含Host等关键头部信息
最终的解决方案是在MCP工具的描述中详细说明格式要求:
1 |
|
- 异步任务处理
为了避免SQLMap长时间运行导致的超时,实现了完整的异步任务处理机制:
- 结果解析
输入(用户在Claude Code中的prompt):
使用现有的 SQL注入 MCP 工具,帮我检测这个 HTTP 流量是否有注入:
GET /Less-1/?id=1 HTTP/1.1
Host: 127.0.0.1:8888
Accept-Encoding: gzip, deflate, br
Accept: /
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36
Cache-Control: max-age=0
未来优化方向
现在这只是一个小demo , 后续遇到问题, 还有很多地方需要优化
短期优化
- 增加更多 参数指定,
- SQLMap参数优化(level risk dbms technique等)
- 支持更多注入类型检测
- 任务管理方面还是要优化, 现在这个有的扫描时间太长了, AI 不够智能的话, 还有默认的对话超时, 会导致失败. 必须再想一想任务编排怎么办