Laravel Debug mode远程代码执行漏洞(CVE-2021-3129)复现分析
漏洞描述:
Laravel 是一个免费的开源 PHP Web 框架,在国内外应用十分广泛。2021年1月份,国外某安全研究团队披露了 Laravel <= 8.4.2 版本中存在远程代码执行漏洞。
当Laravel开启了Debug模式时,由于Laravel自带的Ignition组件的某些函数功能存在过滤不严的问题,导致攻击者可以发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,造成远程代码执行,执行任意命令控制服务器。
影响范围:
Laravel 框架 < 8.4.3
facade ignition 组件 < 2.5.2
漏洞分析:
环境搭建
系统环境:centos 7
Laravel:Laravel v8.30.0
PHP:PHP v7.3.25
运行以下命令使用docker部署Laravel漏洞环境
git clone https://github.com/SNCKER/CVE-2021-3129
cd CVE-2021-3129
docker-compose up -d
docker images
浏览器访问http://ip:8888,出现以下界面则表示Laravel漏洞环境搭建成功
远程代码执行漏洞分析
安装好环境,使用命令
docker ps -a
docker exec -it d1ef96fcb17f /bin/sh
进入容器,执行容器命令
查看.env文件,此时app key为空
在错误页面点击generate app key
burpsuite抓包可以抓到一个参数为solution的post请求包。
此时再去查看.env文件,app key已经被赋予了一个值。
刷新页面也正常了。
在源码中搜索上述请求包中的GenerateAppKeySolution,发现其在\Laravel\src\vendor\facade\ignition\src\Solutions路径下。在这个目录下存在9个solution php文件,通过这些solution,开发者可以通过点击按钮的方式,快速修复一些错误。本次漏洞就是其中的MakeViewVariableOptionalSolution.php过滤不严谨导致的。
所有的solution都是通过solution控制器进行调用的,控制器的路径为\Laravel\src\vendor\facade\ignition\src\Http\Controllers\ExecuteSolutionController.php。当解决不同的错误时,就会调用不同的solution,solution中的run方法会接收参数执行相应操作。
跟进MakeViewVariableOptionalSolution.php中的run方法,发现其调用了makeOptional方法。makeOptional方法采用file_get_contents函数处理接收参数中的viewFile参数,file_get_contents函数的作用是把整个文件读入一个字符串中。此处viewFile参数是可控的,且接收后也未作任何处理。
可以实现php反序列化漏洞从而RCE,如果存在文件上传功能,通过在文件中插入构造的恶意序列化内容,上传后配合配合phar://伪协议给viewFile参数赋值,就可以实现反序列化远程命令执行
漏洞复现
远程代码执行漏洞复现
将exp下载到本地
https://github.com/SNCKER/CVE-2021-3129/blob/master/exploit.py
给phpggc执行权限
chomd 777 phpggc/phpggc
ls
修改exploit.py中的url为自己的漏洞地址http://192.168.10.132:8888
vim exploit.py
:wq
把exp和phpggc放在同一目录下,使用python3执行exp
ls
python3 exploit.py
最终,得到密码。
修复建议
安全版本
Laravel 8.4.3及其以上版本
facade ignition 2.5.2 及其以上版本
修复方案
将Laravel框架和ignition组件升级至安全版本
参考文章:https://blog.csdn.net/weixin_44023403/article/details/115262270