跳转至
2020 | 强网杯 | 强网先锋

Funhash

解题思路

  • 首页给出了源码
    <?php
    include 'conn.php';
    highlight_file("index.php");
    //level 1
    if ($_GET["hash1"] != hash("md4", $_GET["hash1"]))
    {
        die('level 1 failed');
    }
    //level 2
    if($_GET['hash2'] === $_GET['hash3'] || md5($_GET['hash2']) !== md5($_GET['hash3']))
    {
        die('level 2 failed');
    }
    //level 3
    $query = "SELECT * FROM flag WHERE password = '" . md5($_GET["hash4"],true) . "'";
    $result = $mysqli->query($query);
    $row = $result->fetch_assoc();
    var_dump($row);
    $result->free();
    $mysqli->close();
    ?>
    
  • 在使用==!=进行比较时,如果以0e开头的字符串,0e后跟的所有字符都是数字,那么整个字符串会按科学计数法计算,即是 \(0\),暴力查找,通过 level 1
    <?php
    $i = 0;
    while (true)
    {
        $n = "0e".($i++);
        $h = hash("md4", $n);
        if($n == $h)
        {
            printf($n);
            break;
        }
    }
    ?>
    
    $ php .\gethash1.php
    0e251288019
    
  • level 2 出现===!==,既判断参数的值也判断参数的类型,计算哈希的结果是字符串类型,但md5无法处理数组,可以使用任意两个不相等的数组绕过
  • level 3 为 SQL 注入,需要绕过md5($str,true),网上检索到可供使用的字符串有ffifdyop129581926211651571912466741651878684928,经md5之后转 ASCII 的字符串中包含分别包含' or '6' or '8
  • 通过 level 1、2、3 即可获得 Flag
    获得 Flag!

参考资料


最后更新: 2020年10月26日 10:36:26
Contributors: YanhuiJessica

评论