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

11 人参与

在安全审计的日常里,数组类型的隐蔽特性常被当作“灰色地带”。当开发者误以为 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 参数结构的记录,也能在事后快速定位异常的数组注入尝试。

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

参与讨论

11 条评论
  • 巨蟹暖光

    md5比对居然还能这么玩,PHP弱类型真是坑

    回复
  • 星空仰望者

    登录接口没做强制类型检查的赶紧自查吧

    回复
  • 古调独弹

    in_array那个场景我踩过雷,白名单直接变摆设

    回复
  • 暗语浮生

    求问下filter_var能防住v1[]=这种提交吗?

    回复
  • 加密骑士

    又是PHP的锅?其他语言有类似问题不

    回复
  • 玻璃糖盒

    太阴了,看着像正常请求,日志里根本看不出异常😂

    回复
  • 落日漫游者

    防御建议里加个array_key_exists是不是更稳?

    回复
  • 醉卧沙场

    这不就是去年我司被黑的套路?当时查了三天才定位到数组绕过

    回复
  • 玄冥叟

    之前就栽在这坑里,排查半天才找到原因

    回复
  • 药童马十九

    挺隐蔽的,开发时真得多留个心眼

    回复
    1. 洋葱圈忍者

      @ 药童马十九 是啊,坑太多了

      回复