Php代码审计
2017-11-24 本文已影响0人
queena_
Challenge
show_source(__FILE__);
$flag = "xxxx";
if(isset($_GET['time'])){
if(!is_numeric($_GET['time'])){
echo 'The time must be number.';
}else if($_GET['time'] < 60 * 60 * 24 * 30 * 2){
echo 'This time is too short.';
}else if($_GET['time'] > 60 * 60 * 24 * 30 * 3){
echo 'This time is too long.';
}else{
sleep((int)$_GET['time']);
echo $flag;
}echo '<hr>';
}?>
Solution
1、根据代码可以看出当time在60 * 60 * 24 * 30 * 2(5184000)和60 * 60 * 24 * 30 * 3(7776000)之间时进入sleep(),
但是我们不能等那么长时间,所以需要绕过sleep();
2、is_numeric()函数支持普通数字型字符串、科学记数法型字符串、部分支持十六进制0x型字符串,但是int强制类型转换不能正确转换类型有十六进制型字符串、科学计数法型字符串(部分)
3、5184000的十六制0x4F1A00,7776000的十六进制0x76a700
4、当传入参数如?temp=0x4F1A00或0x76a700都会得到flag