启动场景后,网页显示一段字符串。
看起来像md5值,但是又过长了。
步骤一:右键查看源代码,没有发现任何异常。
步骤二:使用dirsearch去查看是否有其他可疑文件。
在终端输入:
dirsearch -u http://117.72.52.127:19983/
运行结果如图:
步骤三:看起来flag.php很可疑。打开查看。
页面是空的,右键查看源代码也是空的。
步骤四:再根据题目意思,说备份。那么index.php.bak这个备份文件很是可疑。于是下载下来,打开查看。内容如下:
看到这段代码,大概意思是获取请求的URI数据,之后再进行一系列的操作。然后有两个参数,key1和key2。当key1和key2的md5值相等,并且key1本身不等于key2时,可以输出flag。
那首先我们需要得到两个参数。具体如何得到,我们可以用php代码去测试下。测试代码如下:
<?php
$url1 = "http:www.baidu.com?key1=4446566&key2=5555";
$str1 = strstr($url1, "?");
echo $str1;
echo("<br>");
$str2 = substr($str1,1);
echo $str2;
echo("<br>");
$str3 = str_replace('key','',$str2);
echo $str3;
echo("<br>");
parse_str($str3);
echo("<br>");
echo $key1;
echo("<br>");
echo $key2;
echo("<br>");
?>
运行结果如下图:
虽然后面代码出错了,但是我们可以由此知道:
strstr($url1, "?")是取url1中从?开始到最后的字符串。
substr($str1,1)是从索引为1开始截取的字符串。
str_replace('key','',$str2)是将字符串中的key替换成空。
代码的具体含义如下:
include_once "flag.php"; //包含运行依次flag.php
ini_set("display_errors", 0); //关闭错误显示
$str = strstr($_SERVER['REQUEST_URI'], '?'); //取出URI中从?开始到最后的字符串
$str = substr($str,1); //取出str中索引1到最后的字符串
$str = str_replace('key','',$str); //把str中的key替换成空
parse_str($str); //解析str字符串,解析出来的参数就是URI中的传参
echo md5($key1); //输出key1参数
echo md5($key2); //输出key2参数
if(md5($key1) == md5($key2) && $key1 !== $key2){ //如何key1和key2并不相等,但是key1和key2的md5值相等
echo $flag."取得flag"; //输出flag
}
因为最后我们需要key1和key2参数,去计算md5值,所以我们想到双写绕过。也就是kkeyey,这样中间的key被替换成空字符串后,外面的字符串连接起来还是key。
步骤五:
我们需要找到值不同但是md5值相同的两个字符串。查找相应资料后,发现PHP在处理哈希字符串时,会利用”!=”或””来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
那么我们只要找到两个字符串,md5后以“0E”开头的就行。
在网上搜了几个,我找了两个“QNKCDZO”和“240610708”。
步骤六:
把找到的参数放进浏览器,使用get请求参数传递,key1和key2参数需要双写绕过,之后尝试。flag出现。
浏览器输入:http://117.72.52.127:19983/index.php?kekeyy1=QNKCDZO&kekeyy2=240610708