SuperAPI AI 工具集

exploiting-type-juggling-vulnerabilities

安全与审计

查看项目

更新于 10-15 15:45

技能介绍

用途

本技能用于在获得授权的安全测试与教学场景中,发现并验证 PHP 因松散比较(==)引发的类型混淆(Type Juggling)漏洞。适用时机包括:测试 PHP Web 应用是否存在认证绕过;评估密码比较与哈希校验逻辑;测试使用松散比较(== 而非 ===)的应用;对处理 JSON 或反序列化输入的 PHP 应用进行代码审查;评估依赖类型相关比较的输入校验。

主要能力

  • 识别类型混淆候选点:登录/认证表单、密码比较端点、接受 JSON 输入的 API、令牌/哈希验证、用于访问控制的数值比较。
  • 利用松散比较实施认证绕过:通过 JSON 发送整数 0、布尔 true、空数组 []、null 等类型,绕过密码校验;利用 strcmp(array, string) 返回 NULL 的特性绕过比较。
  • 利用魔术哈希碰撞:PHP 将 "0e..." 字符串按科学计数法解释为 0,若哈希以 "0e" 开头且其后仅含数字,则在松散比较中等于 0。资料给出若干 MD5 与 SHA1 魔术哈希示例。
  • 利用访问控制中的比较绕过:数值比较绕过("0" == "0e12345")、字符串转整数("1abc" == 1)、布尔比较角色检查、null 比较跳过校验。
  • 通过反序列化输入利用:PHP json_decode() 保留类型,攻击者可通过 JSON 控制类型(true、0、null、[]);unserialize() 类型混淆(将字符串类型改为整数类型)。
  • 自动化测试:使用 Burp Intruder 配合类型混淆载荷列表,或用 Python 脚本批量测试各参数。

使用方式

工作流分为六步:

  1. 识别类型混淆候选点:查找登录/认证表单、密码比较端点、接受 JSON 的 API、令牌/哈希验证、数值访问控制;用 curl 测试应用是否接受 JSON 输入以控制类型。
  2. 利用松散比较认证绕过:通过 JSON 发送 password 为 0、true、[]、null;用 password[]=anything 触发 strcmp 返回 NULL。
  3. 利用魔术哈希碰撞:使用已知魔术哈希输入(如 "240610708"、"QNKCDZO"、"aabg7XSs"、"aabC9RqS" 等)匹配以 "0e" 开头的存储哈希;资料给出对应 MD5/SHA1 值及循环测试脚本。
  4. 利用访问控制中的比较:测试数值比较绕过、字符串转整数、布尔角色检查、null 比较跳过。
  5. 通过反序列化输入利用:用 JSON 发送 token、pin、code 为 true 或 0 绕过验证;构造序列化对象改变类型。
  6. 自动化测试:使用 Burp Intruder 载荷列表(true、false、null、0、1、""、[]、"0"、"0e99999"、"240610708" 等)或 Python requests 脚本批量测试。

适用场景

  • 认证绕过:发送 "password": true 绕过松散比较密码校验。
  • 魔术哈希碰撞:使用 MD5 以 "0e" 开头的输入匹配存储哈希。
  • strcmp 数组绕过:发送 password[]=anything 使 strcmp() 返回 NULL。
  • PIN/OTP 绕过:发送整数 0 匹配实际验证码的 "0e..." 哈希。
  • 角色提升:发送 "role": true 匹配任意非空角色字符串。

限制与前提

  • 需要理解 PHP 类型系统与松散比较行为、魔术哈希(0e 前缀)及其科学计数法解释。
  • 需要 Burp Suite 进行请求操纵与参数类型更改、本地 PHP 开发环境测试载荷、PayloadsAllTheThings 的魔术哈希字符串集合,以及向目标发送 JSON 或序列化数据以控制输入类型的能力。
  • 工具与系统包括:Burp Suite、PHP 交互式 shell、PayloadsAllTheThings、phpggc、自定义 Python 脚本、PHPStan/Psalm。
  • 法律声明:本技能仅用于授权安全测试与教育目的。未经授权对不拥有或未获书面许可测试的系统使用属违法行为,可能违反计算机欺诈相关法律。

修复建议

  • 在安全关键代码中将所有 == 替换为 ===(严格比较)。
  • 使用 password_verify() 进行密码比较,而非直接比较。
  • 使用 hash_equals() 进行时序安全的哈希比较。
  • 在比较操作前校验输入类型。
  • 在所有文件中启用 PHP strict_types 声明。