BugkuCTF-Web16-备份是个好习惯

    首先打开题目,发现一串代码

    1. d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

    仔细分析为两段相同的MD5值,根据题目描述,备份是个好习惯,猜测应该有备份文件,使用Dirsearh目录扫描,发现备份文件。

    BugkuCTF-Web16-备份是个好习惯 - 图1

    下载下来打开,发现index.php代码如下:

    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: Norse
    5. * Date: 2017/8/6
    6. * Time: 20:22
    7. */
    8. include_once "flag.php";
    9. ini_set("display_errors", 0);
    10. $str = strstr($_SERVER['REQUEST_URI'], '?');
    11. $str = substr($str,1);
    12. $str = str_replace('key','',$str);
    13. parse_str($str);
    14. echo md5($key1);
    15. echo md5($key2);
    16. if(md5($key1) == md5($key2) && $key1 !== $key2){
    17. echo $flag."取得flag";
    18. }
    19. ?>

    整段代码的意思是将get的两个参数中的key替换为空(这里可以用kekeyy绕过),然后对key1,key2的值进行md5加密,并进行比较,如果md5加密的值一样而未加密的值不同,就输出flag。

    这里绕过方法有两个:

    一是md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

    构造利用URL如下:

    http://114.67.246.176:11656/?kekeyy1[]=aaa&&kekeyy2[]=bbb
    

    直接获得flag。

    BugkuCTF-Web16-备份是个好习惯 - 图2

    二是利用==比较漏洞,如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。

    下列的字符串的MD5值都是0e开头的:

    QNKCDZO

    240610708

    s878926199a

    s155964671a

    s214587387a

    s214587387a

    构造利用URL如下:

    http://114.67.246.176:11656/?kekeyy1=QNKCDZO&&kekeyy2=240610708
    

    直接获得flag。

    BugkuCTF-Web16-备份是个好习惯 - 图3