【漏洞復現】Laravel Debug mode RCE(CVE-2021-3129)
中科至善 2021-12-02
一、應用簡介
Laravel是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你構建一個完美的網絡APP,而且每行代碼都可以簡潔、富于表達力。
在Laravel中已經具有了一套高級的PHP ActiveRecord實現 -- Eloquent ORM。它能方便的將“約束(constraints)”應用到關系的雙方,這樣你就具有了對數據的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查詢構造器(query-builder)的所有方法。目前最新版本為8.70。
在ZoomEye上搜索可獲得1,640,229條記錄。
二、漏洞描述
Laravel在開啟了Debug模式時,由于自帶的Ignition組件對file_get_contents()和file_put_contents()函數的不安全使用,使得攻擊者可以通過發(fā)起惡意請求,構造惡意Log文件等方式觸發(fā)Phar反序列化,最終造成遠程代碼執(zhí)行。
三、影響版本
Laravel <= 8.4.2
Ignition <2.5.2
四、環(huán)境搭建
下載環(huán)境,在GitHub上有集成好的環(huán)境,可利用docker一鍵部署
git clone https://github.com/SNCKER/CVE-2021-3129
下載后進入CVE-2021-3129目錄,執(zhí)行命令docker-compose up -d拉取環(huán)境
完成后會將端口映射到8888上。
訪問地址,點擊首頁的Generate app key。
之后刷新一下頁面,出現如下圖所示即搭建成功。
五、漏洞復現
exp的使用需要借助phpggc,可在GitHub上下載:git clone https://github.com/ambionics/phpggc.git,下載完成后對hphggc給定執(zhí)行權限。
修改exploit.py最后面的地址為自己的攻擊地址(該exp在下載的CVE-2021-3129目錄中),之后將exploit.py放在與phpggc同一目錄,使用python3執(zhí)行。
六、exp分析
該漏洞利用過程其實是利用phpggc生成對應的phar文件→清空laravel.log→將編碼后的字符寫入到log中→清除干擾字符→執(zhí)行phar反序列化,在exploit.py中通過定義exp類,設計phpggc鏈集合,將上述操作集中起來之后調用。
清除日志部分
編碼處理以及反序列化
最終執(zhí)行相關命令
七、漏洞分析
漏洞出現在/src/vendor/facade/ignition/src/Solutions/目錄下的MakeViewVariableOptionalSolution.php文件中。
這里的主要功能就是把$variableName替換為為$variableName ?? ''并且使用了file_get_contents()去讀取了一個可控的路徑參數,所以在這里可以用phar://協(xié)議去觸發(fā)phar反序列化。
八、修復建議
建議通過官網將 Laravel 框架升級至8.4.3及以上版本,或將 Ignition組件升級至 2.5.2 及以上版本。