$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-logic-auditPHP Web 业务逻辑漏洞审计工具。识别认证/授权以外的逻辑缺陷:Mass Assignment、流程绕过、竞态条件、状态机缺陷、支付/权限时序漏洞等,输出证据链、分级、PoC 与修复建议(禁止省略)。
| 1 | # PHP 业务逻辑漏洞审计(php-logic-audit) |
| 2 | |
| 3 | 分析 PHP 项目中“业务流程正确性”相关缺陷。重点覆盖: |
| 4 | - Mass Assignment(批量赋值导致可越权字段被写入) |
| 5 | - 流程绕过(前置状态缺失或校验可被跳过) |
| 6 | - 状态机缺陷(状态更新不完整/可回滚/不一致) |
| 7 | - 竞态条件(TOCTOU、并发导致多次发放、重复扣款等) |
| 8 | - 越权的业务层校验缺失(与 IDOR 联动,但更关注业务归属一致性) |
| 9 | - 付款/退款/异步任务顺序漏洞(异步回调可被伪造或重复处理) |
| 10 | |
| 11 | ## 分级与编号 |
| 12 | - 详见:`shared/SEVERITY_RATING.md` |
| 13 | - 漏洞编号:`{C/H/M/L}-LOGIC-{序号}` |
| 14 | |
| 15 | ## 必检证据(强制) |
| 16 | 每条逻辑漏洞必须提供: |
| 17 | 1. 触发路由与方法(真实路由/HTTP 方法) |
| 18 | 2. 状态前置条件(攻击者需要满足哪些条件:登录态/角色/资源状态) |
| 19 | 3. 缺陷点位置(业务服务/控制器/回调 handler/队列消费逻辑) |
| 20 | 4. 状态变化链(从输入 -> 校验 -> 写库/调用外部服务 -> 状态更新) |
| 21 | 5. 与并发/时序相关证据(如果有:事务边界/锁/唯一约束/幂等处理) |
| 22 | |
| 23 | ## Mass Assignment 审计(必做) |
| 24 | 必须检测: |
| 25 | - 是否存在把 `$_POST/Request->all()/request()->all()` 直接写入模型或数据库的行为 |
| 26 | - 是否存在允许更新敏感字段的白名单缺失(如 `role/is_admin/status/price/owner_id` |
| 27 | - ORM/框架的填充保护是否启用(例如 Laravel `$fillable/$guarded`) |
| 28 | |
| 29 | ## 竞态与幂等审计(必做) |
| 30 | 必须检测: |
| 31 | - 同一操作是否在并发下被执行多次(扣款、发货、升级、领取) |
| 32 | - 是否依赖“先查再写”(TOCTOU)且缺少事务/行锁 |
| 33 | - 是否有幂等键与去重(如 payment_id/nonce) |
| 34 | |
| 35 | ## 流程绕过审计(必做) |
| 36 | 必须检测: |
| 37 | - 是否只在前置页面校验但后端缺少校验 |
| 38 | - 是否依赖前端隐藏字段/按钮来限制流程 |
| 39 | - 回调接口是否鉴权与签名可靠、是否可被重复调用 |
| 40 | |
| 41 | ## 类型比较绕过与弱类型漏洞(必做) |
| 42 | PHP 中的弱类型/宽松比较经常导致认证/授权/业务判断绕过,必须审计: |
| 43 | - 是否存在使用 `==`/`!=`(非严格比较)进行鉴权判断、状态判断或权限校验 |
| 44 | - 是否存在 `in_array($x, $arr)` 未设置严格模式(第三参),导致类型转换绕过 |
| 45 | - 是否存在 `array_search`、`strpos` 等结果参与条件判断时未正确处理(例如 `strpos` 返回 0 被当成 false,或与字符串/数字混用) |
| 46 | - 是否存在 `md5/sha1` 用于“认证校验”且直接用 `==` 比较摘要(必须识别是否使用 `hash_equals`) |
| 47 | - 是否存在 token/JWT/验证码比较逻辑使用了可被时序推断或类型胶水绕过的方式(比较函数/条件表达式需证据化) |
| 48 | |
| 49 | 每条弱类型漏洞必须给出: |
| 50 | - 位置证据(比较表达式/条件语句/相关函数调用位置) |
| 51 | - Source(用户输入如何进入该比较) |
| 52 | - Sink(错误比较导致的分支结果:放行/绕过/错误状态) |
| 53 | - PoC(请求序列或 payload,至少包含“对比值如何构造触发绕过”) |
| 54 | |
| 55 | ## 认证/账户工作流逻辑(必做) |
| 56 | 必须审计与“状态迁移”相关的业务流程安全: |
| 57 | - 密码重置 token 是否单次使用、是否有明确过期时间、是否与用户绑定 |
| 58 | - OTP/验证码是否存在重放(同一 token/nonce 是否能重复使用) |
| 59 | - 登录失败次数/账户锁定/速率限制是否实现且发生在后端 |
| 60 | - 账户枚举:错误信息/响应码/耗时差异是否泄露是否存在用户 |
| 61 | - 支付/退款回调是否幂等(同一 transaction 是否重复入账/重复发放) |
| 62 | |
| 63 | PoC 必须给出至少两步请求序列:先建立前置状态,再触发状态迁移动作,并标注观测点(数据库字段/响应码/重定向/回调执行次数)。 |
| 64 | |
| 65 | ## PoC(强制) |
| 66 | 逻辑漏洞 PoC 必须给出“请求序列”: |
| 67 | - 至少两步:触发前置条件 -> 触发漏洞动作(并标注真实路由) |
| 68 | - 若是竞态漏洞:给出并发请求方式与观测点(例如两个 curl 同时发送的步骤) |
| 69 | |
| 70 | ## 报告输出 |
| 71 | ``` |
| 72 | {output_path}/vuln_audit/logic_{timestamp}.md |
| 73 | ``` |
| 74 | |
| 75 | ## 条目模板(强制) |
| 76 | - 位置证据 |
| 77 | - 缺陷描述(必须基于代码语义,不可只用一般性话术) |
| 78 | - 状态变化链 |
| 79 | - 可利用前置条件 |
| 80 | - 请求序列 PoC |
| 81 | - 修复建议(包括:白名单/事务/锁/幂等/后端二次校验) |