連結:https://buuoj.cn/challenges#[ACTF2020 新生賽]Include
開啟環境後如下,只有一個 "tips" 的超連結。
訪問 tips,留意傳入了 "file" 引數。
接下來,可以嘗試下路徑穿越:?file=flag.php../../../../../etc/passwd
。
可以看到,存在路徑穿越漏洞,但是透過路徑穿越漏洞並沒有讀取到根目錄下的 flag 檔案。
這時候,回過頭去再看訪問 tips 時的情況。
可以看到,file 引數被設定為了 "flag.php",因此,有可能 flag 是藏在了 flag.php 檔案內,以註釋的方式存放著,因此就需要考慮如何能夠成功的讀取到 flag.php 檔案的原始碼。
下面直接給出 Payload:?file=php://filter/read=convert.base64-encode/resource=flag.php
。
知其然,知其所以然。
在 PHP 中, 存在著 "偽協議" 這一特性。
即,PHP 帶有很多內建 URL 風格的封裝協議,可用於類似 fopen、copy、file_exists、filesize 的檔案系統函式。 除了這些封裝協議,還能透過 stream_wrapper_register 函式來註冊自定義的封裝協議。
總而言之,PHP 偽協議就是用於處理檔案的一種協議,比如說在 include 一些檔案時,使用各種偽協議就可以特定化的處理該檔案或決定如何訪問檔案、解析檔案。
在 PHP 中,支援偽協議的函式有如下:
- include。
- include_once。
- require。
- require_once。
- fopen。
- file。
- readfile。
- file_get_contents。
- ...。
而偽協議的分類有如下:
- file://。
- php://。
- zip://。
- ...。
其中,"php://" 偽協議用於訪問各個輸入/輸出流。
"php://" 偽協議的條件:
- allow_url_fopen:off/on。
- allow_url_include:off/on(php://input、php://stdin、php://memory、php://temp 偽協議需要 on)。
這裡著重介紹以下 "php://" 偽協議中的 "php://filter"偽協議。
php://filter 是 PHP 中的一種特殊的偽協議,它允許對資料進行過濾處理。它可以透過輸入流或輸出流來運算元據,常用於對檔案、資料流等進行編碼、解碼、壓縮等處理。
主要用途:
- 對檔案內容進行轉換,如 base64 編碼、ROT13 加密、字串大小寫轉換等。
- 對 HTTP 請求的輸入或輸出流進行過濾。
基本的語法:php://filter/read=<過濾器列表>/resource=<操作目標>
。
因此,本題可以使用 PHP 偽協議讀取 "flag.php" 檔案原始碼。
最後,將得到的 Base64 字串解碼後即可得到 flag。