PHP+代码审计从0到0.1
一道利用$_GET强制类型转换漏洞的题
<?php
show_source(__FILE__);//show_source()函数功能:使得服务端返回括号内指出文件的源码
$flag = "xxxx";//这个就是我们要看的东西啦
if(isset($_GET['time'])){ //isset():指出变量是否存在 $_GET:通过url即地址栏中输入,将参数传给脚本
if(!is_numeric($_GET['time'])){ //is_numeric():检测变量是否为数字或数字字符串,我们的主人公
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; //目标是把flag输出
}
echo '<hr>'; //输出分隔横线
}
?>
在了解了每个函数的功能后,我们只是知道了要做什么,仍然不能解决任何问题。
作为一个纯纯的小白,经过一段“思考后”可得到:
https://github.com/CHYbeta/Code-Audit-Challenges/blob/master/php/challenge-2.md
即:
is_numeric()支持三种字符串:普通数字型字符串、科学记数法型字符串、部分支持十六进制0x型字符串
然而:
强制类型转换却不能正确转换十六进制型字符串、部分科学计数法型字符串。
所以:
我们可以通过传入十六进制型字符串骗过is_numeric()又不用等很长时间。
在地址栏输入:
http://localhost/1.php/?time=0x76a700
可得到:
为避免下次进行类似的“思考”,干脆把PHP中类似漏洞全部了解一遍,地址:
http://blog.csdn.net/qq_31481187/article/details/60968595