PHP类型混淆(Type-juggling):CTF中如何绕过数组弱比较验证?
绕过PHP弱比较及后续验证的Payload构造
先拆解代码中的核心验证逻辑:
$_GET["usr"] == $user:$user是array("user" => "admin"),PHP的==对数组的比较规则是键值对完全匹配(顺序不影响)。!strcmp($_GET["pwd"], $secret):strcmp函数若接收非字符串参数(比如数组)会返回NULL,!NULL等价于true。
Payload构造细节:
usr参数:需传递一个包含user=>admin键值对的数组,GET请求中格式为usr[user]=admin,这样$_GET["usr"]会被PHP解析为和$user一致的数组,弱比较直接成立。pwd参数:传递任意数组即可绕过strcmp验证,比如pwd[]=xxx,此时strcmp返回NULL,取反后条件成立。path参数:指定要扫描的目录,比如path[1]=/(根目录)或者path[1]=./(当前目录)。
完整URL Payload示例:
?usr[user]=admin&pwd[]=123&path[1]=/
逻辑验证:
$_GET["usr"]被解析为array("user" => "admin"),和$user用==比较时键值对完全匹配,第一个条件通过。$_GET["pwd"]是数组类型,strcmp对比数组与字符串$secret返回NULL,!NULL为true,第二个条件通过。- 最终执行
scandir并输出指定目录的文件列表。
内容的提问来源于stack exchange,提问作者pittgi
相关产品推荐
相关产品推荐

