1. 程式人生 > 實用技巧 >成理信安協會第一屆信安大挑戰WEB題千反田很好奇WP

成理信安協會第一屆信安大挑戰WEB題千反田很好奇WP

就是試了個小壞嘛,不要打我

Step1

開啟題目,映入眼簾的是這個:

肯定知道題目是被藏起來了,所以正常情況下就開始翻cookie啦,用burp抓啦,之類的。但是我在index.php裡設定了302跳轉,跳轉去了start.php,你怎麼重新整理start.php發現不了index.php的。我在原始碼裡提示

其實就是提醒大家開著控制檯檢視網路或者開著burp等著抓包。很容易發現

這個被跳轉的index。

Step2

那麼如何訪問被跳轉的網頁呢?burp修改就可以。

然後轉到Render,檢視加載出的頁面。

明顯是一道反序列化問題,其中考察了wakeup魔術方法繞過漏洞與一道程式碼審計題。
程式碼審計的邏輯基本是,不能輸入數字,但是要和3722304989相等。這個數字肯定有特殊性,開啟程式設計師模式計算器,輸入這個數字,發現

十六進位制下竟然是DDDDDDDD,沒有一個數字。所以就是十六進位制繞過。
給出反序列化指令碼:

<?php
class CDUTSEC
{
    public $chitanda;
    public $eru;
}

$tr = new CDUTSEC();
$tr->chitanda="yesIamOKtoOVERCOMEallofthesepuzzles";
$tr->eru=0xDDDDDDDD;
echo urlencode(serialize($tr));

繞過wakeup的方法很簡單,把序列化字串對應成員個數的數字改大即可

改大。

拿到“真正”的主頁

Step3

我承認我有點惡趣味了(滑稽

有點搞心態,實際上這裡真的沒有太噁心,burp抓下包

在響應頭看到這一項(專門寫的跟真的一樣
簡單base64,得到puzzle is in puzzle! 提示去訪問puzzle.php

這裡有個非預期,我本地不分大小寫都可以訪問,但部署之後必須為Puzzle.php首字母大寫才行(悲 由於種種原因,沒有再通知這個問題

第一個考點,看似簡單,實際上下劃線被我ban掉了。下劃線怎麼替代?很簡單,在php中用.或者+都可。
之後我們得到原始碼。

<?php
    $query = urldecode($_SERVER["QUERY_STRING"]);
    $puzzle_start = $_GET['puzzle_start'];
    $a = $_GET['a'];
    $b = $_GET['b'];
    $c = $_GET['c'];
    $d = $_GET['d'];
    $file_name = $_GET['file_name'];
    $content = file_get_contents("php://input");
    $filename = "upload/" . $file_name;

    if (strpos($query, '_') !== False)
        die("嘿嘿,'_'是不被允許的喲~");
    if ($puzzle_start == 1) {
        show_source(__FILE__);
    }
    if ($a != $b && md5($a) == md5($b)) {
        echo "通過第一個難題!不錯!";
        if ($c !== $d && sha1($c) === sha1($d)) {
            echo "通過第二個難題!繼續!";
            if (preg_match('/cat|system|passthru|exec|shell_exec|POST|<?\ph.|.?>|flag\s/is', $content))
                die("看我最後擋不擋的住你吧!");
            if (file_put_contents($filename, $content))
                die("上傳成功!");
        } else die("彆氣餒!");
    } else die(" 再試試!");
    ?>

其實就是兩個簡單的繞過加上一個看著難實際上有很大空子的一句話寫入。
第一個比較:兩變數弱型別比較不等,md5編碼後弱型別比較相等,利用php弱型別比較中0exxx在比較的時候會將其視作為科學計數法,所以無論0e後面是什麼,0的多少次方還是0(0e後面的必須是數字)從而通過驗證。(具體看協會這篇文章https://cdutsec.gitee.io/blog/2020/04/06/php-weakphp/
第二個比較:兩變數強型別比較不等,md5編碼後強型別比較相等。這裡就不能用弱型別的騷操作繞了,這裡傳入陣列導致函式報錯來繞過。
最後一個看似喪心病狂的正則,其實就是想讓你不要寫入直接讀取flag的php語句了。就算用"",${IFS}等繞過空格等命令檢測,寫入php中可發揮不了作用。這裡涉及四個點:?>標籤其實不需要也可以;<?php的替換;GET形式的一句話馬;GET形式的一句話馬不能用菜刀蟻劍連線。
另外,當需要post變數的時候,可能會發現網頁說的哪裡不對勁是我ban掉了右鍵和f12工作臺。其實也沒啥,就是用burp。
最終payload:

好了,萬事俱備,最後get傳參:

結束。
其實就是簡單web知識點的縫合怪罷了。