ワンクリックで
sql-injection-comprehensive
SQL 注入多策略综合检测——分诊布尔盲注 / 时间盲注 / 报错 / UNION,覆盖各主流 DBMS。 流量中参数值带引号触发响应突变、响应含数据库错误关键字、同参数二态可控、注入 SLEEP 耗时增加时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
SQL 注入多策略综合检测——分诊布尔盲注 / 时间盲注 / 报错 / UNION,覆盖各主流 DBMS。 流量中参数值带引号触发响应突变、响应含数据库错误关键字、同参数二态可控、注入 SLEEP 耗时增加时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
白盒建模——一次深度建模产出五张共享模型:项目架构(技术栈/分层/框架自有封装/闭源依赖位置)、 入口点(路由/中间件信任边界)、认证与权限(会话/角色/多租户/归属字段)、业务(实体/流程状态机/ 业务不变量/高价值资产)、全局威胁(攻击面×漏洞类别的适用性映射,供下游逐一全测)。本能力不做漏洞判定,为后续 漏洞维度分析建立共享底图。
OS 命令注入综合检测——覆盖直接命令拼接 / shell 元字符 / 参数注入 / 间接 RCE,按回显 / 时间 / 带外通道分诊。 流量中参数值含主机名 / URL / 文件名 / 命令片段、响应里出现 shell 错误关键字(`/bin/sh` / `cmd.exe` / `command not found`)、注入 `sleep N` 耗时增加、上传后异步处理链路时使用。
文件上传多策略综合检测——覆盖扩展名 / MIME / 魔术数 / 解析漏洞 / 上传链组合(LFI / Zip Slip / SVG XSS / SVG XXE)。 流量含 multipart/form-data 上传、响应回显落盘路径、上传后文件可被 GET 解析、上传字段含 filename / path 可控时使用。
IDOR 水平越权检测 — 通过替换资源标识符(ID/UUID/路径)访问他人资源的风险;适用于用户资料、订单、文档、租户隔离场景。
检测路径穿越和本地文件包含(LFI)风险;当目标存在文件读取/下载/预览功能且含路径参数时触发;适用于文件下载、日志查看、模板加载等场景。
黑盒建模 — 迭代式攻击面建模,按站点级 / 页面级 / 功能级三粒度推进;进入新页面即触发一次页面级建模、切换新身份各刷新一次,产出端点账本与页面语义模型,为后续漏洞维度的适用性判断提供依据。
| name | sql-injection-comprehensive |
| description | SQL 注入多策略综合检测——分诊布尔盲注 / 时间盲注 / 报错 / UNION,覆盖各主流 DBMS。 流量中参数值带引号触发响应突变、响应含数据库错误关键字、同参数二态可控、注入 SLEEP 耗时增加时使用。 |
| when-to-use | 当存在 SQL 注入嫌疑、注入类型或数据库不明确,需要多策略分诊探测时 |
| allowed-tools | bash,read_file,list_files,rg |
| user-invocable | false |
以下是已知的 SQLi 触发线索,作为基线起点而非必检硬清单。结合流量与响应特征动态调整:
[x] done[-] n/a (原因)(原因要具体到响应特征)[+] added (来源)响应特征命中信号(漏洞-specific):
SQL syntax / ORA- / PostgreSQL / Unclosed quotation)1=1 vs 1=2 响应可区分SLEEP(N) 耗时增加 N 秒入口类型粗筛(仅作类似场景示例 不限于此):
业务命名只作粗筛——sink 语义相同就属此范围。JSON body 任一字段、header / cookie 任一字段都是 SQLi 候选,不限于"看起来像数据库"的字段名;具体参数位置由 HAR 实际请求推导,不在此预设清单。
source 是任何用户可控输入(query / body / header / cookie / 路径参数 / 已入库再回读的字段)。sink 是 SQL 上下文:WHERE / LIKE / ORDER BY / GROUP BY 子句、INSERT 值、UPDATE SET、JOIN ON、HAVING、LIMIT / OFFSET、任何拼接进 SQL 查询的字符串位置。
任何 source 未经参数化绑定就被拼接到 sink,即构成 SQL 注入——攻击者控制的字符串改变了 SQL 语法树。预编译参数(PreparedStatement / $1 $2 / ? 占位符)把数据和指令在协议层隔离开,是默认防御。
ORM 不是免疫层:所有 ORM 都有 Raw 通道(.raw() / .query() / Raw() / nativeQuery()),且字段名 / 表名 / 排序方向不可参数化(必须白名单)。
列出 SQLi 黑盒可观测的响应通道集合(observation-channel)——攻击效果可被黑盒探测的侧信道。输入位置(query / body / header / cookie / path)从 HAR 实际请求推导,本节不预设清单。
响应观察通道集合(observation-channel):
error-echo:错误信息回显(数据库错误关键字 + 可控数据回显)union-echo:UNION 拼接列值直接渲染到响应boolean-diff:同参数二态稳定可区分(status / 内容 / 长度)time-sidechannel:耗时可控(SLEEP / WAITFOR / pg_sleep)oob-dns / oob-http:带外通道触发(DNS / HTTP 请求)secondary-readback:二阶注入在另一端点回读时触发| 类型 | 触发条件 | 响应特征 | 适用 DBMS |
|---|---|---|---|
| 布尔盲注(Boolean) | 响应内容随条件 true/false 二态变化 | ' AND 1=1 -- vs ' AND 1=2 -- 响应可区分 | 全部 |
| 时间盲注(Time-based) | 响应内容不可区分但耗时可控 | SLEEP(N) / WAITFOR DELAY / pg_sleep | MySQL / MSSQL / PG |
| 报错注入(Error-based) | 错误信息回显到响应 | updatexml() / extractvalue() / cast() | MySQL / MSSQL |
| UNION 注入 | 查询结果直接渲染到响应 | UNION SELECT NULL, NULL, ... 列数匹配后回显 | 全部 |
| 堆叠查询(Stacked) | 驱动允许 ; 分隔多语句 | ; DROP TABLE... 副作用 | MSSQL / PG(MySQL 默认禁) |
| 二阶注入 | 先入库后回读时触发 | source 入库不报错,回读拼接时触发 | 全部 |
| OOB(带外) | 无回显且无延时通道 | LOAD_FILE / xp_dirtree 触发 DNS / HTTP | MySQL / MSSQL |
按以下方式从侦察输出中筛 SQLi 候选:
从 HAR / 端点账本:
q / search / keyword / id / sort / order / filter / where / category / tag/api/search / /list / /page / /{id} / /query / /filter从业务场景(由页面级建模输出,见 {page}-page-model.md 语义节):
从身份切换 HAR 对比:
通过响应(错误关键字 / header / 行为)推断后端 DBMS / 框架 / WAF,优化 payload 选择。
| 响应特征 | 推断 DBMS | payload 选择 |
|---|---|---|
You have an error in your SQL syntax / MySQL / SQLSTATE | MySQL / MariaDB | 用 SLEEP() / -- 注释 / 0x hex / /**/ 绕过 |
syntax error at or near / PostgreSQL | PostgreSQL | 用 pg_sleep() / -- 注释 / ` |
Unclosed quotation mark / ODBC / SQL Server / Microsoft | MSSQL | 用 WAITFOR DELAY / xp_cmdshell / 堆叠查询 |
ORA-00933 / Oracle | Oracle | 用 DBMS_PIPE.RECEIVE_MESSAGE 延时 / ` |
SQLite3.OperationalError / near | SQLite | 限制:无 SLEEP、无堆叠、无 xp_cmdshell |
| 响应特征 | 推断框架 | 优化方向 |
|---|---|---|
X-Powered-By: Express / Set-Cookie: connect.sid | Express (Node.js) | 大概率 Sequelize 或 mysql2,常见拼接形态 |
Set-Cookie: PHPSESSID / X-Powered-By: PHP/... | PHP | mysqli / PDO 拼接 |
Server: nginx + JSESSIONID cookie | Java / Spring | JdbcTemplate / MyBatis ${} |
Server: gunicorn / Python traceback | Django / Flask | .raw() / .extra() |
X-Aspnet-Version | ASP.NET | ADO.NET / EF Raw |
| 响应特征 | WAF | 绕过方向 |
|---|---|---|
cf-ray header / Cloudflare 拦截页 | Cloudflare | 编码绕过 / chunked / 大小写混用 |
request blocked + 阿里云 LOGO | 阿里云 WAF | URL 编码 / 注释截断 |
imunify360 | Imunify360 | 同上 |
| 自定义 403 + 安全狗签名 | 安全狗 | 同上 |
响应指纹仅作辅助判断——真实的 sink 验证仍需在 §9 闭环要求章节定义的可观测效果证据。
加载本 skill 时按这些问题思考:
?sort= / ?order_by=)?这类不能参数化,必须看白名单。参数末尾追加 ' / " / ) / --,观察响应突变 / 报错。不要全打,按 sink 语义选 2-3 个候选试:
' 或 ",看是否出现新的语法错误特征或响应突变) / )),观察从"错误→正常"或"正常→错误"的可复现翻转-- / #;其他 -- / ;输出:候选上下文集合(numeric / string + quote + paren_close + comment)。
按 §6 响应指纹表识别 DBMS 与框架。结论标注置信度(high / medium / low)。
有错误回显且语法错误可触发? → 报错注入(信息量最高)
查询结果直接渲染到响应? → UNION 注入
响应内容差异稳定(TRUE/FALSE)? → 布尔盲注
响应不可区分但耗时可控? → 时间盲注(速度最慢)
无回显无延时? → OOB / 堆叠(仅 MSSQL/PG)
/**/ / 等价函数(SUBSTRING ↔ SUBSTR / SLEEP ↔ BENCHMARK)0x... 十六进制编码 / CHAR(0x...) / 宽字节 %bf%27(GBK / 旧版本 MySQL)/**/ / + / %0a / %0b / (...)?sort=(case when 1=1 then created_at else id end)闭环判定(confirmed / suspected / not_vulnerable)以
common/closure-verification.md为准。下面只列本漏洞特有的可观测信号。
confirmed(必须挂可观测效果证据):
' AND 1=1 -- vs ' AND 1=2 -- 响应可区分,重复 3 次稳定,差异点可指认SLEEP(3) 耗时 > 基线 + 2.5s,重复 3 次稳定,且无延时参数耗时回到基线updatexml 报错带 @@version / database() / 表名)suspected(落 status=needs_review):
not_vulnerable(落 status=not_vulnerable):
禁止仅凭"响应 500""执行无异常""绕过了某黑名单"判 confirmed——这些只到 suspected。
why:反例义务属于交付契约——"该子系统无 SQLi"或"已防护"结论是覆盖完整性产物声明,缺失反向验证清单会让下游误信"该维度全站安全"。
写"未发现 SQLi"或"已防护"前,产物必须包含:
清单不完整 → 结论降级为 partial-coverage 并显式声明未覆盖范围。
反例 1:响应突变源于 WAF 拦截,不是 SQL 报错
request blocked / security violation 字样cf-ray / Server: imunify360 等可识别 WAF-- 是否被替换 / 拦截反例 2:错误 500 不带 SQL 关键字
{"error": "internal"},无数据库关键字SQL / query / database / DBMS 名字反例 3:MySQL LIMIT 后参数化失败的旧版拼接不一定是注入
LIMIT ? 占位曾不支持,开发者用拼接SELECT ... LIMIT + pageSize反例 4:字段名拼接(无引号不报错)
ORDER BY / GROUP BY 后接的字段名不能用引号包裹,参数化对它无效?sort=created_at → 后端拼接 ORDER BY;改成 ?sort=invalid_column 报错 unknown column?sort / ?order_by 参数 + 改成无效字段名报错 unknown column?sort=(case when 1=1 then created_at else id end) 看是否可控字段顺序;或 ?sort=if(1=1,id,name)反例 5:二阶注入(入库时不报错,回读时触发)
',入库正常;后台 admin 页面以邮箱查日志,回读时拼接进新查询反例 6:JSON body 字段被忽略的 SQLi 候选
/api/users 的 body 含 {"sortBy": "id", "filter": "..."},filter 字段被拼到 WHERE反例 7:跨子系统隐式推广(漏报高发模式)
破坏性 / 不可逆动作的闭环边界以
common/closure-verification.md《破坏性 / 不可逆动作的闭环边界》节为准。下面只列 SQLi 特有的破坏点。
禁止对真实业务数据执行以下动作来"挂可观测效果":
; DROP TABLE / ; TRUNCATE / ; DELETE FROM <real_table>(堆叠查询场景)UPDATE ... SET ... WHERE 1=1(无 WHERE 限定的更新)LOAD_FILE 读取系统文件后回写、或 INTO OUTFILE 写入文件系统的动作xp_cmdshell / sys_exec / COPY ... FROM PROGRAM 触发 OS 命令的动作允许的非破坏验证手段:
sastx_sentinel_),仅对哨兵执行可破坏操作WHERE col = (CASE WHEN ... THEN col ELSE col END) 类构造测试逻辑可控性,不改变查询语义? / $N 占位 + 单独传 args#{} 而非 ${}(${} 仅限明确可信白名单内的字段名 / 表名)where: {col: val} / db.Where("col = ?", val),禁止字符串拼接进 Raw 通道FILE 权限)