前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php框架slim架构上存在XXE漏洞(XXE的典型存在形式)

php框架slim架构上存在XXE漏洞(XXE的典型存在形式)

作者头像
phith0n
发布2020-10-15 11:08:59
1.2K0
发布2020-10-15 11:08:59
举报

【过年了,每天发一篇以前的存货,一共七篇。】

现代cms框架(laraval/symfony/slim)的出现,导致现今的php漏洞出现点、原理、利用方法,发生了一些变化,这个系列希望可以总结一下自己挖掘的此类cms漏洞。

slim是一个设计思路超前的知名的php轻框架,完美结合了psr7来设计,至今用户已超过100w:

QQ20151126-2@2x.png
QQ20151126-2@2x.png

在阅读其源码的过程中,我发现其存在一个只有在框架式CMS中才会出现的漏洞。

官方网站: http://www.slimframework.com/

漏洞详情

这个漏洞存在于最新版(3.0)中。 首先用conposer安装之

代码语言:javascript
复制
composer require slim/slim "^3.0@RC"

看其文档: http://www.slimframework.com/docs/objects/request.html#the-request-body 获取POST数据,是利用getParsedBody方法,而这个方法对POST的处理,是按照content-type来区分和解析的:

QQ20151127-0@2x.png
QQ20151127-0@2x.png

很典型的问题,在这篇帖子里也提到过: http://zone.wooyun.org/content/19908 有时候框架会帮开发者一些他可能并不需要的『忙』,比如slimphp这里,常规的POST的content-type为application/x-www-form-urlencoded,但只要我将其修改为application/json,我就可以传入json格式的POST数据,修改为application/xml,我就可以传入XML格式的数据。 这个特性将会导致两个问题:

  1. WAF绕过
  2. 可能存在的XXE漏洞

WAF绕过这个肯定不用说了,常规的WAF一般只检测application/x-www-form-urlencoded的数据,一旦修改数据类型则将通杀各大WAF。 XXE是本漏洞的重点。 我们看到解析body的代码:

代码语言:javascript
复制
<?php
    public function __construct($method, UriInterface $uri, HeadersInterface $headers, array $cookies, array $serverParams, StreamInterface $body, array $uploadedFiles = [])
    {
        $this->originalMethod = $this->filterMethod($method);
        $this->uri = $uri;
        $this->headers = $headers;
        $this->cookies = $cookies;
        $this->serverParams = $serverParams;
        $this->attributes = new Collection();
        $this->body = $body;
        $this->uploadedFiles = $uploadedFiles;
        if (!$this->headers->has('Host') || $this->uri->getHost() !== '') {
            $this->headers->set('Host', $this->uri->getHost());
        }
        $this->registerMediaTypeParser('application/json', function ($input) {
            return json_decode($input, true);
        });
        $this->registerMediaTypeParser('application/xml', function ($input) {
            return simplexml_load_string($input);
        });
        $this->registerMediaTypeParser('text/xml', function ($input) {
            return simplexml_load_string($input);
        });
        $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) {
            parse_str($input, $data);
            return $data;
        });
    }   

实际上解析代码是作为回调函数写在Request类的构造方法里了。 可见这里直接调用了simplexml_load_string解析$input,造成XML实体注入漏洞。 所以,用slim framework 3.0开发的CMS,只要获取了POST数据,都将受到此XXE漏洞的影响。

漏洞证明

编写一个最简单的demo页面,只有一个获取POST信息并输出的功能:

代码语言:javascript
复制
<?php
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->post("/post", function($request, $response) {
    $parsedBody = $request->getParsedBody();
    print_r($parsedBody);
});
$app->run();

搭建在三个白帽里:http://520fdc0ca2c37864f.jie.sangebaimao.com/ 正常请求:

QQ20151127-1@2x.png
QQ20151127-1@2x.png

触发XXE漏洞并读取/etc/passwd:

QQ20151127-2@2x.png
QQ20151127-2@2x.png

漏洞修复

在slimphp2中,官方是对这块进行一定处理了:

代码语言:javascript
复制
<?php
    /**
     * Parse XML
     *
     * This method creates a SimpleXMLElement
     * based upon the XML input. If the SimpleXML
     * extension is not available, the raw input
     * will be returned unchanged.
     *
     * @param  string                  $input
     * @return \SimpleXMLElement|string
     */
    protected function parseXml($input)
    {
        if (class_exists('SimpleXMLElement')) {
            try {
                $backup = libxml_disable_entity_loader(true);
                $result = new \SimpleXMLElement($input);
                libxml_disable_entity_loader($backup);
                return $result;
            } catch (\Exception $e) {
                // Do nothing
            }
        }
        return $input;
    }

不知为何在3.0版本中官方就无视这个问题了。 我猜可能有两个原因:

  1. 官方注意到了这个问题,但认为3.0版本需求的php版本在5.5以上,而错以为5.5以上的php就已经不存在XXE的隐患了。但实际上XML外部实体的解析,和php版本并无关系,而是和编译时的libxml库版本有关。
  2. 官方尚未注意到这个问题。

感觉前者的可能性较大。 所以解决方案也还是按照2中的方案进行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞详情
  • 漏洞证明
  • 漏洞修复
相关产品与服务
脆弱性检测服务
脆弱性检测服务(Vulnerability detection Service,VDS)在理解客户实际需求的情况下,制定符合企业规模的漏洞扫描方案。通过漏洞扫描器对客户指定的计算机系统、网络组件、应用程序进行全面的漏洞检测服务,由腾讯云安全专家对扫描结果进行解读,为您提供专业的漏洞修复建议和指导服务,有效地降低企业资产安全风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档