数字医学与健康大会DMHC——美创与您相约古都金陵
2025-08-12
美创科技打造县域医疗灾备新标杆|神木市医院 HIS 系统数据库分钟级切换演练实录
2025-07-02
百万罚单警示!DCAS助力金融机构筑牢数据安全防线,实现监管合规
2025-06-20
2025中国互联网产业年会丨《中国互联网产业绿色算力发展倡议》正式发布
2025-02-07
美创用户专访 | 精细化管理:医疗行业数据分类分级的策略与实践
2025-01-10
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务01
漏洞编号
CVE-2021-3129
02
漏洞描述
Laravel 是一个免费的开源 PHP Web 框架,在国内外应用十分广泛。2021年1月份,国外某安全研究团队披露了 Laravel <= 8.4.2 版本中存在远程代码执行漏洞。
当Laravel开启了Debug模式时,由于Laravel自带的Ignition组件的某些函数功能存在过滤不严的问题,导致攻击者可以发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,造成远程代码执行,执行任意命令控制服务器。
03
影响范围
Laravel 框架 < 8.4.3
facade ignition 组件 < 2.5.2
04
漏洞分析
1、环境搭建
系统环境:Ubuntu 18.04
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漏洞环境搭建成功
2、远程代码执行漏洞分析
安装好环境,使用命令
docker ps -a
docker exec -it d1ef96fcb17f /bin/sh
进入容器,执行容器命令
查看.env文件,此时app key为空
在错误页面点击generate app key
burpsuite抓包可以抓到一个参数为solution的post请求包。
此时再去查看.env文件,app key已经被赋予了一个值。
刷新页面也正常了。
在源码中搜索上述请求包中的GenerateAppKeySolution,发现其在LaravelsrcvendorfacadeignitionsrcSolutions路径下。在这个目录下存在9个solution php文件,通过这些solution,开发者可以通过点击按钮的方式,快速修复一些错误。本次漏洞就是其中的MakeViewVariableOptionalSolution.php过滤不严谨导致的。
所有的solution都是通过solution控制器进行调用的,控制器的路径为LaravelsrcvendorfacadeignitionsrcHttpControllersExecuteSolutionController.php。当解决不同的错误时,就会调用不同的solution,solution中的run方法会接收参数执行相应操作。
跟进MakeViewVariableOptionalSolution.php中的run方法,发现其调用了makeOptional方法。makeOptional方法采用file_get_contents函数处理接收参数中的viewFile参数,file_get_contents函数的作用是把整个文件读入一个字符串中。此处viewFile参数是可控的,且接收后也未作任何处理。
结合国外安全研究员Sam Thomas在Black Hat 2018上分享的议题,利用phar文件会以序列化的形式存储用户自定义的meta-data这一特性(参考https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It-wp.pdf),可以实现php反序列化漏洞从而RCE。参考知道创宇404实验室的研究文章(参考https://paper.seebug.org/680/),受影响的php文件操作函数如下,上述提到的file_get_contents函数恰好在受影响的函数之列。
由此,如果存在文件上传功能,通过在文件中插入构造的恶意序列化内容,上传后配合配合phar://伪协议给viewFile参数赋值,就可以实现反序列化远程命令执行。
可以使用phpggc工具生成一个图片payload进行测试。
05
漏洞复现
远程代码执行漏洞复现
将exp下载到本地
https://github.com/SNCKER/CVE-2021-3129/blob/master/exploit.py
执行命令python3 49424.py exploit.py
执行成功
通过burpsuite抓包即可清晰的看到exp的利用思路,其不依靠文件上传功能,而是利用了viewFile的参数值会保存在/storage/logs/laravel.log日志文件中的特性,将phar序列化代码直接注入到该日志文件中,通过精心构造最终使laravel.log日志文件能通过phar伪协议反序列化执行命令。
想要利用现有的laravel.log日志文件,就必须将该文件“转变”为规整的phar序列化文件
这里利用了php://filter过滤器特性,使用相关的过滤器对日志文件内容进行多次编码和过滤,达到“清空”日志文件的目的。
这里过滤器的使用顺序是:
convert.iconv.utf-8.utf-16be(将utf-8编码转为utf-16be编码)
convert.quoted-printable-encode(打印所有不可见的字符)
convert.iconv.utf-16be.utf-8(将utf-16be编码转为utf-8编码)
convert.base64-decode(解码所有的非base64编码字符)
清空日志文件后,给日志文件加一条AA前缀。
将编码后的攻击载荷写入到日志文件中。
再次利用php://filter过滤器清空干扰字符。
利用成功。
06
修复建议
1、安全版本
Laravel 8.4.3及其以上版本
facade ignition 2.5.2 及其以上版本
2、修复方案
将Laravel框架和ignition组件升级至安全版本