提交需求
*
*

*
*
*
立即提交
点击”立即提交”,表明我理解并同意 《美创科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于美创

    申请试用
      Laravel Debug mode远程代码执行漏洞(CVE-2021-3129)复现分析
      发布时间:2021-03-26 阅读次数: 245 次

      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组件升级至安全版本

      免费试用
      服务热线

      马上咨询

      400-811-3777

      回到顶部