这题是一道代码审计和PHP弱类型比较的题目,不算太难,但是我被坑了。
首先进行代码审计:
<?php
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>
需要注意的是
return $number == '54975581388';
不要看成
return $number = '54975581388';
这个代码的思路就是判断key这个字符串的的每一位都不能是1到9的数字,但是它还要和’54975581388’弱类型相等。因此我们可以把54975581388转化为十六进制。这里我就被坑了。54975581388转化为正确的16进制应该是ccccccccc,恰好没有数字,但是我在谷歌浏览器上的harkbar进行16进制encode,结果是错的,导致我这题无法下手了。以后长个记性,以后编码解码都在burp上,没有的再上网查,而且多找几个。我还记得我以前上网找rot13解码,最后解出来的是不区分大小写的,又把我那题卡死了。真的气死我了。
这题直接提交?key=0xccccccccc就可以获得flag了。以后一定要长心眼,别让工具把自己拖累了。