解題思路
進入頁面之后,一個大大的滑稽。
查看源碼
查看源碼發現有source.php 。打開
發現還有一個hint.php。打開發現
由此可知是代碼審計了
解題
代碼審計
先看此段代碼,大致意思是。如果提交過來的file不是空的,並且是字符串,經過了emmm類中,checkFile函數的過濾。那么就執行包含文件。由此可知可能存在文件包含,目錄穿越的漏洞。而要包含的就是ffffllllaaaagggg。
現在看如何繞過過濾
主要看這段代碼,這段代碼的意思是
獲取傳入的參數位數,然后截取前該位數的字符。
舉個例子,傳入參數是flag.php,首先經過mb_strpos獲取位數,為8.然后經過mb_substr截取flag.php的前八位,也就是flag.php。
然后需要該參數在白名單里,也就是截取第一個?后的值為hint.php或source.php
然后經過url解碼后再進行一次過濾,如果最后返回真,即可包含文件
文件包含
payload:?file=source.php%253F../../../../../ffffllllaaaagggg
確保url解碼后能通過白名單。瀏覽器會解碼一次,所以?二次編碼,%253F,這里是php的一個特性:
?兩次編碼可以實現跨目錄,#二次編碼也可以
$page經過兩次解碼 $_page=source.php?../../../../../ffffllllaaaagggg
經過函數截取?前的內容,source.phph可通過白名單檢驗,然后通過此include $_REQUEST['file']
實現文件包含,因為source.php也被解析為目錄,通過目錄穿越即可到達,獲得flag
總結思路
核心思路:
- 查看源碼得知本題考點為代碼審計,文件包含,目錄穿越
- 確定獲得flag值通過文件包含,本題共有四個可有true返回的條件,構造一個滿足的條件即可
- php將二次編碼的?前的內容視為目錄
知識點
- 代碼審計
- 目錄穿越
- 文件包含