基于数组类型绕过的长尾利用场景

在安全审计的日常里,数组类型的隐蔽特性常被当作“灰色地带”。当开发者误以为 md5、strcmp 等函数只能接受标量时,攻击者便能利用 PHP 自动将字符串转换为数组的行为,实现对逻辑判断的精准绕过。这个细节看似微不足道,却在实际渗透测试中屡屡出现,甚至在 2022 年的漏洞统计中占据了约 12% 的长尾利用比例。

数组类型绕过的原理

PHP 的弱类型特性允许 $_GET['v1'] 直接以 v1[]=value 的形式提交为数组。若后端代码仅用 !==== 对变量做比较,而未显式检查其类型,数组会在比较时被自动转为字符串“Array”,导致 md5($v1) == md5($v2) 成立,即便 $v1$v2 实际内容完全不同。攻击者只需构造相应的数组参数,即可让原本严密的校验失效。

长尾利用的典型场景

  • 登录接口的 token 验证,使用 md5($user_input) 与数据库哈希直接比对。
  • 文件上传白名单,判断 in_array($ext, $allowed) 时未限制参数为字符串。
  • 密码重置链接的签名校验,采用 hash_hmac('sha256', $data, $key),却在参数拼接前未做类型过滤。
  • 内部 API 的访问控制,依据 strcmp($role, 'admin') 判定权限,却未排除数组输入。

防御与检测要点

最直接的防御手段是对所有外部输入执行显式的类型强制,例如使用 is_string()filter_var() 或者在框架层面开启 request->validate()。同时,审计代码时应关注“比较”语句的左侧是否可能为数组,配合静态分析工具的自定义规则进行批量检测。日志层面,加入对 $_GET$_POST 参数结构的记录,也能在事后快速定位异常的数组注入尝试。

“数组绕过往往隐藏在看似无害的函数调用里,只有把类型检查当作第一道防线,才能真正阻断这些长尾攻击。”

参与讨论

0 条评论

    暂无评论,快来发表你的观点吧!