基于数组类型绕过的长尾利用场景
TOPIC SOURCE
Bugku-前女友(SKCTF)
在安全审计的日常里,数组类型的隐蔽特性常被当作“灰色地带”。当开发者误以为 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 参数结构的记录,也能在事后快速定位异常的数组注入尝试。
“数组绕过往往隐藏在看似无害的函数调用里,只有把类型检查当作第一道防线,才能真正阻断这些长尾攻击。”

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