hunt-deserialization · 不安全反序列化猎杀
只解决不安全反序列化一类:识别"用户可控数据被还原成对象"的落点,判断序列化格式与是否有可用 gadget chain。核心是先靠格式指纹定位落点,再用带外/时序探可达性,gadget 利用谨慎且授权后做。
反序列化 gadget 直达 RCE,破坏性极高。默认只做格式识别 + 带外探测(不投放破坏性 gadget),完整 RCE 利用仅在 scope 明确授权时进行。格式指纹、各语言 gadget 与真实报告见 reference.md。
Scope(授权范围)
先确认授权。 gadget PoC 可能在目标执行代码。
落实:授权目标、允许深度(仅识别/带外探测 / 允许 gadget PoC)、OAST 地址、禁止破坏性/持久化 gadget。任一不清楚就停下问。
Goal
判定用户可控数据是否进入不安全反序列化,识别语言/格式,给出可复现 PoC 与影响(RCE / 对象注入 / 认证绕过),并留存带外命中或回显证据。
Workflow
scope-check → recon → hunt → validate → report。
1. scope-check
- 动作:写
evidence/scope.txt(allow_gadget / oast_domain)。 - 命令:
bash tools/recon.sh <target> --scope-only。 - 终止条件:scope 明确,否则 KILL。
2. recon
- 动作:枚举 cookie/token/viewstate/隐藏字段/导入功能,抓取其值做格式指纹(见
reference.md)。 - 输出:
recon/endpoints.json。 - 命令:
bash tools/recon.sh <target>。 - 终止条件:至少 1 个疑似序列化落点,否则记录结束。
3. hunt
- 动作:对落点用
tools/hunt_deser.py判定格式(PHPO:/JavarO0/pickle/.NET/YAML),并发无害带外探针(能触发外呼的最小 gadget,如 PHPphar/Ruby URI gadget 打 OAST)判可达性。 - 输出:
candidates.json。 - 命令:
python tools/hunt_deser.py --input recon/endpoints.json --output candidates.json --oast <域名>。 - 终止条件:
candidates.json生成。
4. validate → report
- 动作:过 7-Question Gate,通过的在授权下做 gadget PoC 取证。任一 NO → killed。
- 命令:
bash tools/validate.sh candidates.json。 - 终止条件:每条 confirmed/killed,confirmed 有带外/回显证据。
7-Question Gate(任一 NO 则 KILL)
- 目标在授权 scope 内?
- 数据确实被反序列化成对象(格式指纹 + 行为佐证)?
- 有客观信号(带外命中 / 报错泄露类名 / 时延),非猜测?
- 存在可用 gadget 或对象注入达成越权?
- 可复现?
- 已留存证据(带外/回显/原始 payload)?
- 影响可陈述,且 PoC 未做破坏性/持久化?
Finding 输出格式
### <Title>
- Severity: Critical | High | Medium | Low | Info
- Asset: <落点:cookie/参数/导入>
- Reproduction: <格式 + payload + 请求;带外域名/时延>
- Impact: <RCE / 对象注入 / 认证绕过>
- Evidence: <evidence/ 原始 payload + OAST 命中 / 类名报错>
- Status: confirmed | killed(<第几问 NO>)
参考
格式指纹(PHP/Java/Python/.NET/Ruby/YAML)、各语言 gadget 入口、检测特征、真实报告见 reference.md——按 recon 出的语言定向查阅。