不能在CI/CD流水线直接运行sqlmap -u,因其依赖人工交互、WAF探测能力弱、无法处理重定向和JS渲染,必须通过sqlmapapi.py启服务并用Python脚本精确控制请求头、Cookie、level/risk参数及错误捕获。

直接在 CI/CD 流水线里跑 sqlmap -u 基本等于白跑——不是扫不出漏洞,而是扫出来的结果不可信、不可复现、还容易被 WAF 拦死。
为什么不能在 pipeline 里直接调用 sqlmap 命令行
CI 环境通常无交互、无浏览器、无会话上下文,而默认的 sqlmap -u 行为严重依赖三类人工干预:
- 遇到 Cookie 或登录态时,
sqlmap会停住问你是否要保存 session(它不会自动读~/.sqlmap/output/下的历史 session) - WAF 探测阶段默认启用
--level=1 --risk=1,对泛微、致远这类 OA 的中间件接口几乎无效 - HTTP 重定向、302 跳转、JS 渲染页等场景下,
sqlmap默认不跟随或无法解析 DOM,导致目标 URL 实际未到达业务逻辑层
必须用 sqlmapapi.py 启服务 + Python 脚本控制扫描任务
绕过命令行交互限制的唯一可靠方式,是启动 sqlmapapi.py 作为后台服务,再用 HTTP 请求提交任务。这能确保:
- 所有请求头、Cookie、POST body 都可编程注入,比如带上从测试账号登录后拿到的
EW_EBRIDGE_SESSIONID - 可精确控制
level(建议设为3)、risk(建议设为3)、technique(如BEUSTQ覆盖布尔/报错/联合/堆叠/时间五种) - 任务失败时能捕获 JSON 返回里的
"status": "failed"和"errormsg",而不是静默退出
启动服务示例:python sqlmapapi.py -s -p 8775;提交任务示例(Python):requests.post("http://127.0.0.1:8775/task/new"),再 PUT 到 /scan/{taskid}/start 并传入完整 JSON 参数字典。
扫描前必须做目标预筛选,否则 90% 的请求都是废扫
泛微 e-Bridge、蓝凌 EKP 等系统有大量静态资源路径和伪 API,直接扫 /login.jsp 或 /css/ 根本没意义。真实有效的注入点集中在:
- 带参数的 GET 接口:
/api/v1/bridge/query?sql=xxx、/mobile/plugin.do?pluginId=1 - JSON POST 接口:Content-Type 为
application/json,body 含"id"、"code"、"condition"等字段 - 文件上传回调路径:
/file/upload?module=user&type=avatar(某些版本存在 filename 参数注入)
建议先用 curl -sI 批量探测响应头中是否含 X-Powered-By: eBridge 或 Set-Cookie: EW_EBRIDGE_SESSIONID,再对确认是目标系统的 URL 进行参数提取(用 grep -oP '\w+=\K[^&]*'),最后喂给 sqlmapapi。
真正卡住自动化落地的,从来不是“能不能扫”,而是“扫谁”和“怎么让 sqlmap 相信这个请求是合法业务流量”。漏掉任意一个 Cookie、少传一个 User-Agent、没处理好 302 跳转,都可能导致 all tested parameters do not appear to be injectable —— 这句话十次有九次不是目标没洞,是你没把请求拼对。

















