題目介紹
題目是Lilctf2025 的php-jail-is-my-cry
比賽鏈接:https://lilctf.xinshi.fun/
題目環境前半部分是 php最近的phar 新 trick
大佬的原理分析
https://fushuling.com/index.php/2025/07/30/%e5%bd%93include%e9%82%82%e9%80%85phar-deadsecctf2025-baby-web/
具體題目操作可看出題人博客https://blog.kengwang.com.cn/archives/668/#php-jail-is-my-cry
這里重點講學習到的disable_functions bypass 姿勢
現在的條件是 題目有文件上傳的功能以及可以寫webshell,但有嚴格的disable_functions以及disable_classes
姿勢1 fpc_cnext
題目不出網且要執行/readflag, 因此執行/readflag并寫到web目錄
disable_function ban了很多,剩下file_put_contents
和curl
相關函數以及其他沒啥大用的
curl 可以用file協議讀取任意文件,很容易想到打cnext,CVE-2024-2961
文件就用curl file協議讀取,payload生成用柯佬的腳本https://github.com/kezibei/php-filter-iconv
但rce需要文件操作的函數來觸發,這里只有file_put_contents
,不同于之前常見的file_get_contents
直接放payload就行,需要稍作修改,與之前 file_put_contents
繞過死亡exit的方式差不多
不用data協議,數據要自己手動填入,在filter鏈子前加上個base64-decode,而且filter要要用write=,用read=也可以,得寫把payload先寫到文件里 resource的文件名隨意
姿勢2 curlfile_cnext
這個方法是從出題人博客中學到的,非常牛
payload 如下
$cu = curl_init('http://localhost/');
curl_setopt($cu, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cu, CURLOPT_POST, true);
$f = new CURLFile($_GET[0]);
curl_setopt($cu, CURLOPT_POSTFIELDS, ['f' => $f,
]);
$data = curl_exec($cu);
echo $data;
姿勢3 curl加載so
這個姿勢是我在比賽時的做法,搜到了國外的文章,說curl 有個 --engine選項可以加載so文件rce
https://hackerone.com/reports/3293801
那就利用題目的文件上傳傳個so,用curl_setopt
指定so文件來rce