1、[SWPUCTF 2021 新生賽]include
根據提示傳入一個file后顯示了關于flag的代碼
這是一個文件包含,考慮php偽協議,構造payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
2、[SWPUCTF 2021 新生賽]Do_you_know_http
頁面提示特定的browser,用bp抓包后改包。
得到了只能在本地訪問但ip為183.224.81.121,添加X-Forwarded-for:字段,并將ip改為1本地ip:127.0.0.1
頁面任然提示相同信息,但是發現有了一個新的跳轉頁面,嘗試訪問
得到flag
3、[HCTF 2018]Warmup
在body部分中,發現了一個source.php文件,嘗試訪問,
strpos(string,find,start)函數:
返回字符串在另一字符串中第一次出現的位置,如果沒有找到字符串則返回 FALSE。注意: 字符串位置是從 0 開始,不是從 1 開始。
參數 | 描述 |
---|---|
string | 必需。規定要搜索的字符串。 |
find | 必需。規定要查找的字符串。 |
start | 可選。規定在何處開始搜索。 |
mb_substr(str,start,length,encoding) 函數:
返回字符串的一部分,對于substr() 函數,它只針對英文字符, 而mb_substr()對于中文也適用。
參數 | 描述 |
---|---|
str | 必需。從該 string 中提取子字符串。 |
start | 必需。規定在字符串的何處開始。
|
length | 可選。規定要返回的字符串長度。默認是直到字符串的結尾。
|
encoding | 可選。字符編碼。如果省略,則使用內部字符編碼。 |
in_array(search,array,type)函數:
搜索數組中是否存在指定的值,找到值則返回 TRUE,否則返回 FALSE。
參數 | 描述 |
---|---|
search | 必需。規定要在數組搜索的值。 |
array | 必需。規定要搜索的數組。 |
type | 可選。如果設置該參數為 true,則檢查搜索的數據與數組的值的類型是否相同。 |
開始代碼審計:
上段函數定義了一個名為emmm的類,在該類中有一個靜態方法checkFile用于檢查要包含的文件是否在白名單中,白名單是一個關聯數組$whitelist,其中包含了允許包含的文件的鍵值對。在代碼中,允許包含的文件有"source"=>"source.php"和"hint"=>"hint.php"。檢查傳入的$page參數是否為字符串類型,如果不是或者未設置,將輸出"you can't see it"并返回false。
對$page參數進行一系列處理:首先使用mb_strpos函數找到$page中第一個問號的位置,然后使用mb_substr函數將問號之前的部分作為$_page進行處理。
$_page進行URL解碼,并重復之前的處理步驟,如果$_page在白名單中存在,返回true。
如果上述條件都不滿足,則輸出"you can't see it"并返回false。檢查$_REQUEST['file']是否存在且為字符串類型,并調用emmm::checkFile方法進行檢查。如果返回值為true,則通過include語句包含$_REQUEST['file']指定的文件并終止程序執行,否則輸出一個圖片標簽。
開始解題:訪問一下hint.php的文件,
提示說flag位于ffffllllaaaagggg中,但是ffffllllaaaagggg不在白名單范圍內,想要訪問ffffllllaaaagggg,就必須讓最后一段的if語句的三條檢測都為true。checkFile函數會檢查用戶傳入的參數($page)是否匹配白名單列表$whitelist。所以要包含白名單中的文件(source.php或hint.php)。并且checkFile函數是通過傳入的參數 $page 來進行的文件檢查,而不是直接從 URL 中獲取參數。所以我們需要以參數形式傳遞文件名【?file=source.php】,將參數傳給file,而不是直接訪問文件路徑【/source.php】。代碼會截取第一個問號前的字符串并檢查其是否在白名單中。
所以要讓第一個問號?前的內容在白名單中,在問號?后面加上我們想訪問的ffffllllaaaagggg就可以繞過。構造payload:
?file=source.php?ffffllllaaaagggg
沒有查到,用../返回不斷上級目錄并不斷嘗試。