当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(98) 关注此漏洞

缺陷编号: WooYun-2015-156208

漏洞标题: 国际php框架slim架构上存在XXE漏洞(XXE的典型存在形式)

相关厂商: slimphp

漏洞作者: phith0n认证白帽子

提交时间: 2015-11-27 10:57

公开时间: 2016-01-11 15:32

漏洞类型: 任意文件遍历/下载

危害等级: 高

自评Rank: 15

漏洞状态: 未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 默认配置不当 XXE漏洞 框架架构漏洞

24人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-27: 积极联系厂商并且等待厂商认领中,细节不对外公开
2016-01-11: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

歪果仁也没你想的那么屌。
这个漏洞简直典型到炸了,可称之为『开源应用中教科书式的XML实体注入漏洞』。

详细说明:

slimphp是一个知名的php轻框架,以其现代化的设计思路闻名。

至今用户已超过100w:

QQ20151126-2@2x.png



官方网站: http://**.**.**.**/



这个漏洞存在于最新版(3.0)中。

首先用conposer安装之

code 区域
composer require slim/slim "^3.0@RC"



看其文档: http://**.**.**.**/docs/objects/request.html#the-request-body

获取POST数据,是利用getParsedBody方法,而这个方法对POST的处理,是按照content-type来区分和解析的:

QQ20151127-0@2x.png



很典型的问题,在这篇帖子里也提到过: http://**.**.**.**/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的代码:

code 区域
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信息并输出的功能:

code 区域
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->post("/post", function($request, $response) {
$parsedBody = $request->getParsedBody();
print_r($parsedBody);
});
$app->run();



搭建在三个白帽里:http://**.**.**.**/

正常请求:

QQ20151127-1@2x.png





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

QQ20151127-2@2x.png

修复方案:

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

code 区域
/**
* 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版本中官方就无视这个问题了。

我猜可能有两个原因:

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



感觉前者的可能性较大。

所以解决方案也还是按照2中的方案进行。

版权声明:转载请注明来源 phith0n@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝

漏洞Rank:15 (WooYun评价)


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-11-27 10:59 | DloveJ ( 普通白帽子 | Rank:1398 漏洞数:250 | Web安全测试培训 QQ269787775)
    0

    火火火

  2. 2015-11-27 11:03 | 白非白 认证白帽子 ( 普通白帽子 | Rank:475 漏洞数:68 | ♫ Freedom - Anthony Hamilton ♫)
    0

    这个漏洞简直典型到炸了,可称之为『开源应用中教科书式的XML实体注入漏洞』

  3. 2015-11-27 11:53 | 猪猪侠 认证白帽子 ( 核心白帽子 | Rank:4640 漏洞数:354 | 你都有那么多超级棒棒糖了,还要自由干吗?)
    0

    简要描述玩得666666

  4. 2015-11-27 12:11 | h3hz ( 实习白帽子 | Rank:42 漏洞数:5 )
    0

    厉害啊,献上膝盖

  5. 2015-11-27 12:12 | 1937nick ( 普通白帽子 | Rank:123 漏洞数:40 | 水能载舟,亦能煮粥。物尽其用,人尽其能。)
    0

    XML实体注入

  6. 2015-11-27 12:16 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    @猪猪侠 玩6一点才有人点关注~

  7. 2015-11-27 12:37 | zeracker 认证白帽子 ( 普通白帽子 | Rank:1077 漏洞数:139 | 爱吃小龙虾。)
    0

    P牛炸了。。

  8. 2015-11-27 13:57 | Stardustsky ( 路人 | Rank:4 漏洞数:3 | ……)
    0

    我要关注了

  9. 2015-11-27 14:23 | ksss ( 普通白帽子 | Rank:582 漏洞数:88 | 近乖者乖,近坏者坏)
    0

    教科书一般的6

  10. 2015-12-03 14:46 | HackBraid 认证白帽子 ( 核心白帽子 | Rank:1854 漏洞数:296 | 风暴网络安全空间: http://www.heysec.or...)
    0

    @phith0n 玩6点才会有人收藏

  11. 2015-12-03 19:48 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:53 | ☯☯☯☯☯☯☯☯☯☯)
    0

    @phith0n 你这样说必须得点击关注了

  12. 2015-12-04 01:25 | 秋风 ( 普通白帽子 | Rank:438 漏洞数:44 | 码农一枚,关注互联网安全)
    0

    NB!

  13. 2016-01-28 14:51 | 乐乐 ( 普通白帽子 | Rank:148 漏洞数:50 | 一名信息安全员)
    0

    厉害!!!

登录后才能发表评论,请先 登录