启动环境如下:
看见页面有东西,数了数有64位,不是哈希就是md5,32位截断,在看看两个竟然一样,应该是两个md5
解密试试,提示[空密码]/[Empty String],额,有啥用么?
根据页面提示,备份是个好习惯,不管了,先找到备份在说,备份一般都是.bak文件,整个扫描器扫一波在说,过程省略。。。,结果发现确实有这个文件,ctf做多了,不管啥文件顺手就是扔hex工具里面。
可以明显看到有代码,复制出来看看
include_once "flag.php"; # 包含一次
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?'); # 判断?是否是当前URI中的子字符,是则返回?一直到结尾的内容
$str = substr($str,1);
$str = str_replace('key','',$str); # 把str中的key替换为空
parse_str($str); # 把查询字符串解析到变量中
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){echo $flag."鍙栧緱flag";
}
?>
PHP接触的比较少,就挨个查了一下什么意思,可以理解为第1行包含一次flag.php文件,第2行设置告警格式,第3行REQUEST_URI是获取当前的URL,用strstr函数截断,并将?后面的内容赋给参数$str,第4行在截断$str的1后面的内容赋给$str,第5行将str中的key替换为空,6行将str的值解析到变量中,78行输出了key1和key2的md5值,if判断key1和key2的md5相等,并且key1不等于key2的时候才会输出flag。
可以先构造参数试试http://114.67.246.176:14387/?key1=1&key2=2,页面没啥反应,其实也可以理解,代码第5行key被过滤,相当于没有输入参数,我们可以试试http://114.67.246.176:14387/?kkeyey1=1&kkeyey2=2,页面有变化了,解密发现是1,也没啥用啊,不禁一阵头大。
肯定是参数哪里有问题,这块有点蒙蔽,为啥两个参数一样但是md5不一样,不科学啊!只知道md5碰撞,但是我不可能在这提交两文件吧,后来查资料才发现md5不能获取数组的值,数组,难道构造一个数组的参数?http://114.67.246.176:14387/?kkeyey1[]=1&kkeyey2[]=2,提交了果然可以!!!
扩展:
题做完在看了看评论区,发现了新大陆!!!
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0e”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
什么玩意,开头两位是0e的都解释为0,这么草率的么,不禁感叹PHP真是世界上最好的语言!