【漏洞复现】Laravel Debug mode RCE(CVE-2021-3129)
中科至善 2021-12-02
一、应用简介
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。目前最新版本为8.70。
在ZoomEye上搜索可获得1,640,229条记录。
二、漏洞描述
Laravel在开启了Debug模式时,由于自带的Ignition组件对file_get_contents()和file_put_contents()函数的不安全使用,使得攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。
三、影响版本
Laravel <= 8.4.2
Ignition <2.5.2
四、环境搭建
下载环境,在GitHub上有集成好的环境,可利用docker一键部署
git clone https://github.com/SNCKER/CVE-2021-3129
下载后进入CVE-2021-3129目录,执行命令docker-compose up -d拉取环境
完成后会将端口映射到8888上。
访问地址,点击首页的Generate app key。
之后刷新一下页面,出现如下图所示即搭建成功。
五、漏洞复现
exp的使用需要借助phpggc,可在GitHub上下载:git clone https://github.com/ambionics/phpggc.git,下载完成后对hphggc给定执行权限。
修改exploit.py最后面的地址为自己的攻击地址(该exp在下载的CVE-2021-3129目录中),之后将exploit.py放在与phpggc同一目录,使用python3执行。
六、exp分析
该漏洞利用过程其实是利用phpggc生成对应的phar文件→清空laravel.log→将编码后的字符写入到log中→清除干扰字符→执行phar反序列化,在exploit.py中通过定义exp类,设计phpggc链集合,将上述操作集中起来之后调用。
清除日志部分
编码处理以及反序列化
最终执行相关命令
七、漏洞分析
漏洞出现在/src/vendor/facade/ignition/src/Solutions/目录下的MakeViewVariableOptionalSolution.php文件中。
这里的主要功能就是把$variableName替换为为$variableName ?? ''并且使用了file_get_contents()去读取了一个可控的路径参数,所以在这里可以用phar://协议去触发phar反序列化。
八、修复建议
建议通过官网将 Laravel 框架升级至8.4.3及以上版本,或将 Ignition组件升级至 2.5.2 及以上版本。