CTF練習日記——[HCTF 2018]WarmUp 1

大熊和小兔子發表於2024-03-14

一點進去就是一個大大的笑臉,暫時沒有頭緒,點開頁面原始碼試試看

發現了一個source.php,從這裡入手試試呢

能看到在source.php中有許多的if語句,猜測適用於驗證過濾啥的,但看的不是太懂,一個個分析下先

這裡isset()驗證變數是否宣告,is_string判斷是否是字串,只要有一個不符合,就會輸出"you can't see it A"

判斷傳進來的變數是否在白名單whitelist裡面

首先使用mb_strpos函式找到$page中第一個問號的位置,然後使用mb_substr函式將問號之前的部分作為$_page進行處理,也就是一個過濾問號的函式(如果$page的值有?則從?之前提取字串)。

這裡再次進行了白名單檢測

對$page進行URL解碼後,再次進行了白名單驗證

檢測傳入的file是否是非空且是字串並呼叫emmm::checkFile方法進行檢查,如果一個不是就返回笑臉圖片。若都滿足,則透過include語句包含$_REQUEST['file']指定的檔案並終止程式執行。在剛剛的source.php中還提到了hint.php,我們利用試試

提示我們flag in ffffllllaaaagggg,讓我們來分析一下傳入這個東西后,php程式碼是如何進行判斷的:這裡是參考了https://blog.csdn.net/Myon5/article/details/134286537裡解釋的。source.php一般是在html目錄下,往上是www,var,然後到根目錄,flag一般就放在根目錄下面,這裡還有一個hint.php?/或者source.php?/,因此需要返回四層才能到根目錄。也就是我們可以構造如下payload:source.php?file=hint.php?/../../../../ffffllllaaaagggg,得到結果flag:flag{9ea6a0d5-bd15-4008-9bf0-6246f018a463}