| name | codeaudit-methodology |
| description | 代码审计方法论与可重放 POC 构造规范(配合 codeaudit_* 工具链使用)。规划审计意图、验证发现、排查防护点或编写 HTTP POC 时使用。Use when planning audit intents, verifying findings against sanitizers, or constructing replayable HTTP POCs in 代码审计模式 sessions. |
代码审计方法论与 POC 构造规范
本技能补充 codeaudit:protocol:协议规定"记录什么",本技能规定"怎么查、怎么写 POC"。
意图拆解:模块 × 漏洞类矩阵
对每个业务模块逐一对照下表拆分意图(有入口/有数据的格子才立项,避免空转):
| 漏洞类 | 高价值入口特征 |
|---|
| SQL/命令/表达式注入 | 字符串拼接进查询/解释器;Runtime.exec、ProcessBuilder、OGNL/SpEL/EL |
| 鉴权与越权 | 路由缺少权限注解/中间件;对象 id 直接来自请求参数(水平越权);管理接口暴露 |
| 反序列化 | ObjectInputStream、pickle、yaml.load、unserialize、fastjson/jackson 多态 |
| 文件操作 | 上传路径拼接(穿越)、下载参数可控、include/模板包含 |
| SSRF | URL 参数直接发起请求(回调、导入、预览、代理) |
| XSS / 前端 | 模板变量未转义、v-html/innerHTML、富文本 |
| 密钥与弱加密 | 硬编码密钥/密码、ECB/无 IV、Math.random 做令牌、弱哈希存口令 |
| 配置与依赖 | debug 开关、CORS *、依赖清单对照已知 CVE |
| 流程逻辑冲突 | 多步流程(重置/注册/换绑/审批)步骤可跳、校验错位、token 作用域过宽——任意账户接管 |
| 未授权接口组合 | 匿名/低权读接口(userlist、rolist、组织架构)+ 匿名/低权写接口拼出提权或批量拉取 |
| 集合级越权 | list/导出/批量/聚合接口缺行级或租户过滤、分页无上限、批量 id 数组越权 |
| 参数信任与重放 | 金额/数量/折扣服务端未重算、验证后状态不失效、重复提交(资产获取型) |
验证定级(分档 + 误报控制)
先按严重级定档(细节读 ../../refs/verification-tiers.md):critical/high = 双链一致
(另派独立追踪子 agent 从入口重追,三要素——入口/路径/sink——全部吻合才 confirmed,
不一致退回重算一次,仍不一致 suspected+未决点);medium = 单链完整+抽检;low/info = 登记即收。
发现 sink 后必须完成三步再定级:
- 向上追:入口参数如何到达此处(完整数据流,途经每一层记录为 dataflow 证据);
- 查防护:入口校验、参数化查询、编码输出、框架防护(过滤器/中间件/注解)——排查过的防护记为
sanitizer 证据;
- 下结论:防护确认缺失/可绕过 →
confirmed;防护存在但无法确认可绕过、或触发条件未验证 → suspected,并在 description 写明未验证点。
POC 构造规范
poc 必须遵循 Yakit Web Fuzzer 的 HTTP POC 语法:纯报文(请求行 + 头 + 体),绝不夹任何注释;随机/枚举值可用 fuzztag({{int(1,100)}}、{{randstr(6)}});
- 动态计算的值绝不写死:加密、签名、时间戳派生、自定义编码等,报文中用
{{yak(...)}} 占位,并把完整热加载函数(beforeRequest/afterResponse)写入 pocScript——热加载写法见 webfuzzer-hotpatch 技能,加解密函数写法见 yaklang-syntax 技能;
- 参数生成规则、占位符含义、前置条件(如需先登录拿 token)一律写
pocNote,并注明「静态构造,未经发送验证」或「已动态验证」;
- 占位符约定:目标
http://<target>、受害者标识 <victim>、可控参数用真实参数名;
- 从代码可推导出完整请求的漏洞即使未发送也要构造;确实构造不出可重放请求的(密钥硬编码、配置缺陷)才留空
poc;
- 有测试环境时先在
.codeaudit-scratch/ 用 curl 发送验证,成功后原样记录报文。
示例——riddle 参数由时间戳派生时:
证据质量
- 每条证据带
file:line 与关键代码片段(snippet,只贴决定性几行,不贴整段源码);
- 证据链服务于结论:入口(dataflow/entry) → 传播 → sink,逐条可回放;
- 意图收敛后提醒指挥官出报告;收益递减(连续 3 个意图无新发现)时建议终止。
逻辑与组合漏洞审计(链路视角,结果导向)
聚焦取得数据或系统权限的逻辑缺陷。立项判界:攻击者越过了哪道边界、取得了什么此前没有的能力?
只是更快做已有凭证本就能做的事(持密码清除登录锁定)或纯代码缺陷(边界/异常/精度)都不立项。方法五步:
- 画流程:认证/重置/换绑/审批等关键业务,列出每一步的接口、校验点、token 与作用域;
- 找断点:步骤可跳、校验错位(step1 验 A、step3 作用于 B)、token 不绑定用户或可复用、
校验结果信任客户端、响应泄漏验证码;
- 画接口权限矩阵:路由表 × 鉴权中间件,标出匿名可读、匿名可写、低权可写的接口;
- 组合反证:找「匿名读 + 匿名/低权写」能拼出的效果(userlist→rolist→adduser 式提权链、
userlist→重置接口接管、内部互信/网关信任传递断点、旧版本接口绕过新权限);
- 组合验证:按链路顺序构造多请求 poc(每段一个 HTTP 报文,注释标注第几步),
最后一步证明权限或数据到手。
证据记录:entry=链路第一跳接口、dataflow=中间接口与校验点、sink=权限/数据落点;
组合链按链路立项(跨模块的在矩阵多个模块行标注同一 finding id)。细节读 ../../refs/logic-audit.md。
参考手册库(refs/,按需 read,禁止整本读)
| 需求 | 读 |
|---|
| Java sink 面映射 / 某类 sink 可达性判定 | ../../refs/java-sink-reference.md |
| 双链三要素判据、退回与未决处理、抽检规范 | ../../refs/verification-tiers.md |
| 逻辑与组合漏洞:流程冲突/组合链/集合越权/参数重放的高发模式与验证法 | ../../refs/logic-audit.md |
| 覆盖矩阵模板与收敛纪律 | ../../refs/coverage-matrix.md |