CTFer成长记录——CTF之Web专题·bugku—备份是个好习惯

发布时间 2023-07-28 17:22:49作者: MiracleWolf

一、题目链接

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";

  通过代码审计:

  1. $str = strstr($_SERVER['REQUEST_URI'], '?'); 获取当前页面 URL 中 ? 后面的部分。
  2. $str = substr($str,1); 去掉 $str 第一个字符(即去掉 ?)。
  3. $str = str_replace('key','',$str); 将字符串中的 key 替换为空字符串。
  4. if(md5($key1) == md5($key2) && $key1 !== $key2) 判断 $key1 的 MD5 哈希值是否等于 $key2 的 MD5 哈希值,并且 $key1 不等于 $key2
  5. 如果条件满足,则输出 $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弱比较绕过,比较简单。主要是要看懂代码。