欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

PhpSpreadsheet 1.5.0 XXE漏洞复现及分析

来源:本站整理 作者:佚名 时间:2019-01-26 TAG: 我要投稿

0x01 前言
PhpSpreadsheet是一个非常流行的纯PHP类库,能够让你方便的读写Excel、LibreOffic Calc等表格格式的文件,是PHPExcel的替代者。2018年11月13日,PhpSpreadsheet 被爆出存在XXE漏洞(CVE-2018-19277),在表格的解压文件中插入UTF-7编码的恶意xml payload,可绕过PhpSpreadsheet 库的安全检查造成XXE攻击。
 
0x02 影响范围
PhpSpreadsheet 1.5.0及以下版本
 
0x03 漏洞复现
自Office 2007以后,Excel存储的文件后缀为xlsx,相对于之前的旧版本多了一个X,实质上xlsx文件是一个压缩包。新建一个exploit.xlsx空文件,执行unzip exploit.xlsx

将如下payload进行UTF-7编码,并替换掉xl/worksheets/sheet1.xml。
xml version="1.0" encoding="UTF-8"?>
%aaa;%ccc;%ddd;]>
编码后的payload如下图 ,注意一定要修改xml编码encoding的值。

执行zip -r ../exploit1.xlsx *进行重打包生成exploit1.xlsx;切换到Web目录,利用composer安装1.5.0版本的PhpSpreadsheet composer require phpoffice/phpspreadsheet=1.5.0,在同一目录下新建excel.php,内容如下所示:
error_reporting(-1);
require 'vendor/autoload.php';
$reader = PhpOfficePhpSpreadsheetIOFactory::createReader('Xlsx'); //创建Xlsx读对象
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load('exploit1.xlsx'); //加载excel表格文件exploit1.xlsx
?>
开启报错提示后,访问excel.php会看到warning信息,有利于我们快速定位到问题函数和所在行。

随后,在ceye平台上看到了解析xml文件时的外部实体请求。

 
0x04 漏洞分析
漏洞分析从我们创建的excel.php开始,文件第4行调用了vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php的createReader方法,当$readers数组中不存在$readerType的key值时,便会抛出异常。

这里传递的$readerType='Xlsx',因此返回对应的value值为ReaderXlsx::class

77行则创建了PhpOfficePhpSpreadsheetReaderXlsx对象,随后返回给$reader对象,并调用了load方法;跟进到对应的类文件vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php,在389行定义了load方法,方法先调用了File类的assertFile方法判断表格文件是否存在,并在402-403调用 ZipArchive类的open方法打开exploit1.xlsx文件便于调用解压后的子文件。

随后load方法会根据解压后文件类型进行逐一处理,这里不一一分析,根据warning信息直接定位到760行的simplexml_load_string方法,该方法通常用于把 XML 字符串载入对象中,如若使用不当则容易导致XXE漏洞。这里先调用了getFromZipArchive方法处理xl/wordsheets/sheet1.xml,即插入xxe payload的xml文件。

跟进到getFromZipArchive方法,该方法调用了ZipArchive::getFromName方法,根据文件名从压缩文件中获取对应文件的内容并返回。

返回Xlsx.php的757行,getFromZipArchive方法的返回值还经过了securityScan方法处理,跟进到Xlsx类的父类vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php,securityScan方法利用正则表达式匹配/?,正是由于采用了UTF-7编码,导致字符串被编码,从而绕过了securityScan方法对XXE攻击的防御。

 
0x05 官方补丁分析
官方在2018年11月21日放出补丁修复了该漏洞,创建了一个PHPOffice/PhpSpreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php xml内容安全检查的类文件,在Xlsx.php的构造函数中实例化了这个安全类,随后在调用simplexml_load_string方法处理xml内容之前,都会调用安全类的scan方法检查是否存在XXE攻击。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载