[ACTF2020 新生賽]Include

imtaieee發表於2024-10-31

連結: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。

相關文章