BUUCTF[ACTF2020 新生賽]Include 1題解
- 題目分析:
- 知識準備:
- `php://filter` 過濾器參數說明
- 常用過濾器功能對照表
- 開始解題:
- 原理解析
- 構造payload
- 總結
題目分析:
生成靶機,打開網址,查看源碼,抓包查看有無隱藏信息(公式化)。
點擊tips:
發現一段留言:Can you find out the flag?
,同時我們觀察url
http://163da250-9a0d-4ec7-9002-49df5c87e38b.node5.buuoj.cn:81/?file=flag.php
結合題目標題以及url中的?file=flag.php
,幾乎就可以斷定有文件包含漏洞了。
知識準備:
在開始解題之前,我們需要了解PHP偽協議
的知識:
PHP偽協議通過替換數據報的頭部信息來欺騙網絡協議。
以下是關于 php://filter
參數的過濾器整理表格:
php://filter
過濾器參數說明
參數類型 | 過濾器名稱 | 作用 |
---|---|---|
必須項 | resource=<要過濾的數據流> | 指定待篩選過濾的數據流(必填) |
可選項(讀鏈) | read=<過濾器1|過濾器2> | 為讀鏈設置一個或多個過濾器,用管道符 | 分隔 |
可選項(寫鏈) | write=<過濾器1|過濾器2> | 為寫鏈設置一個或多個過濾器,用管道符 | 分隔 |
默認鏈 | <過濾器1|過濾器2> | 未加前綴的過濾器列表將根據操作類型(讀/寫)自動應用到對應鏈 |
常用過濾器功能對照表
過濾器類型 | 過濾器名稱 | 作用 |
---|---|---|
字符串過濾器 | string.rot13 | 等同于 str_rot13() ,進行 ROT13 字符變換 |
string.toupper | 等同于 strtoupper() ,將字符串轉為大寫 | |
string.tolower | 等同于 strtolower() ,將字符串轉為小寫 | |
string.strip_tags | 等同于 strip_tags() ,移除 HTML/PHP 標簽 | |
轉換過濾器 | convert.base64-encode | 等同于 base64_encode() ,進行 Base64 編碼 |
convert.base64-decode | 等同于 base64_decode() ,進行 Base64 解碼 | |
convert.quoted-printable-encode | 將 8-bit 字符串編碼為 Quoted-Printable 格式(可打印字符) | |
convert.quoted-printable-decode | 將 Quoted-Printable 格式解碼為 8-bit 字符串 |
開始解題:
原理解析
后端代碼大概可能是下面這樣:
include($_GET['file'])
如果我不使用PHP偽協議,讀取flag.php之后,include()
就會自動執行其中的PHP代碼,這樣就無法在網站前端閱讀到完整的源碼。但是如果我們使用php://filter
,對文件中的命令進行一些處理,就可以獲得完整的源碼。
構造payload
?file=php://filter/read=convert.base64-encode/resource=flag.php
payload中的每一個過濾器都能從上面的表格中找到,payload實現了把flag.php中的所有字符轉換為BASE64
編碼,以逃脫include()
執行php代碼,獲得完整源碼
BASE64解碼得到:
<?php
echo "Can you find out the flag?";
//flag{5b7c82b0-4473-42a3-bb8c-068dcd50a1d0}
FLAG被注釋掉了,但是通過PHP偽協議找到了。
總結
本題的提示還是非常明顯的,沒有繞彎,主要考察了CTFer對文件包含漏洞和PHP偽協議的理解,總的來說不是很難適合初學者(比如我)。