用途:该技能针对 PHP 松散比较(==)与类型强制转换导致的安全问题,帮助在授权测试或代码审计中判断认证、签名校验、令牌验证是否可被绕过。核心目标是证明服务端分支把不相等的数据判为相等,而非猜出真实密码。
主要能力:
- 松散比较真值表与版本差异:如 '0e123'=='0e999' 为真、'123a'==123 为真;PHP 8 起非数字字符串不再等于 0。
- 魔术哈希(0e… 全数字摘要):如 md5('240610708') 与 md5('QNKCDZO') 均为 0e 开头纯数字,== 比较时被当作浮点 0.0 而相等。
- HMAC 绕过:当代码用 hash_hmac(...) != '0' 或 == 0 比较时,可暴力搜索使摘要匹配 ^0e[0-9]+$ 的数据。需按目标算法与密钥验证。
- NULL 混淆:md5([])、sha1([]) 等错误类型在旧版本可能产生 NULL,配合 @ 或错误处理导致 NULL==NULL 为真。
- CTF 常见手法:strcmp([],...)、intval 进制与科学计数法解析、json_decode(...,true) 后 true 与字符串松散比较、is_numeric('0e12345') 后与 0 相等、反序列化魔术属性等。
使用方式:先识别比较位置(== 还是 hash_equals/===)、PHP 主版本、两侧是否可控。若已使用 hash_equals 或 ===,通常不适用。可用本地 php CLI 或 php -r 复现目标版本行为,并结合静态检索 ==、!= 与缺失 hash_equals 的位置。防御应使用 hash_equals((string)$expected,(string)$actual) 或 ===。
适用场景:CTF、实验室环境、获得书面授权的安全评估与代码审计。
限制:PHP 8 对错误类型抛出 TypeError、非数字字符串与 0 比较返回 false,旧手法可能失效;HMAC 场景在未知密钥时不一定可行;具体负载效果依赖目标 PHP 版本与代码实现,需实测。仅限授权目标使用。