CTF實驗吧讓我進去writeup


初探題目


兩個表單,我們用burp抓包試試

這時候我們發現Cookie值里有個很奇怪的值是source,這個單詞有起源的意思,我們就可以猜測這個是判斷權限的依據,讓我們來修改其值為1,發送得到如下顯示:

代碼審計

發現爆出了源代碼,讓我們來審計一下

$flag = "XXXXXXXXXXXXXXXXXXXXXXX";
$secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!

$username = $_POST["username"];
$password = $_POST["password"];

if (!empty($_COOKIE["getmein"])) {
    if (urldecode($username) === "admin" && urldecode($password) != "admin") {
        if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
            echo "Congratulations! You are a registered user.\n";
            die ("The flag is ". $flag);
        }
        else {
            die ("Your cookies don't match up! STOP HACKING THIS SITE.");
        }
    }
    else {
        die ("You are not an admin! LEAVE.");
    }
}

setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));

if (empty($_COOKIE["source"])) {
    setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {
    if ($_COOKIE["source"] != 0) {
        echo ""; // This source code is outputted here
    }
}

我們如果需要獲得flag,需要滿足一下條件:
1.Cookie中getmein的值不能為空
2.username必須為admin和password不能為admin
3.Cookie中的getmein必須等於md5($secret.urldecode($username.$password))
滿足這三個條件才可獲得flag,可是我們無法得知$secret的值為多少
setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));
發現下面有行代碼是這樣寫的,將輸出的md5($secret . urldecode("admin" . "admin"))作為cookie輸出,結合前面的數據包我們可以知道輸出的值為571580b26c65f306376d4f64e53cb5c7 可是這串md5是由$secret+'adminadmin'轉md5而得到的,如果我們在password輸入admin將不滿足前面所需的三個條件

死局轉生

我們知道常見的md5是16位的,而這里的md5正是16位,我們的$secret是十五位的,加上'adminadmin'就變成25位了,很明顯這里的md5肯定會出現重復,所以我們可以哈希長度拓展攻擊繞過這個死局
這里附兩個講述具體原理的鏈接:
http://www.freebuf.com/articles/web/69264.html https://www.cnblogs.com/p00mj/p/6288337.html

在Kali下用hashpump操作

最好我們構造數據包,把生成的數據發送即可獲得flag


免責聲明!

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



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