PHITHON的公开漏洞php框架slim3架构上存在XXE漏洞(XXE的典型存在形式) 2018-04-30
slimphp是一个知名的php轻框架,以其现代化的设计思路闻名。
至今用户已超过100w:
官方网站: http://www.slimframework.com/
这个漏洞存在于最新版(3.0)中。
首先用conposer安装之
1 | composer require slim/slim "^3.0@RC" |
看其文档: http://www.slimframework.com/docs/objects/request.html#the-request-body
获取POST数据,是利用getParsedBody方法,而这个方法对POST的处理,是按照content-type来区分和解析的:
很典型的问题,在这篇帖子里也提到过: 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的代码:
1 | public function __construct($method, UriInterface $uri, HeadersInterface $headers, array $cookies, array $serverParams, StreamInterface $body, array $uploadedFiles = []) |
实际上解析代码是作为回调函数写在Request类的构造方法里了。
可见这里直接调用了simplexml_load_string解析$input,造成XML实体注入漏洞。
所以,用slim framework 3.0开发的CMS,只要获取了POST数据,都将受到此XXE漏洞的影响。
编写一个最简单的demo页面,只有一个获取POST信息并输出的功能:
1 | require 'vendor/autoload.php'; |
正常请求:
触发XXE漏洞并读取/etc/passwd:
在slimphp2中,官方是对这块进行一定处理了:
1 | /** |
不知为何在3.0版本中官方就无视这个问题了。
我猜可能有两个原因:
1.官方注意到了这个问题,但认为3.0版本需求的php版本在5.5以上,而错以为5.5以上的php就已经不存在XXE的隐患了。但实际上XML外部实体的解析,和php版本并无关系,而是和编译时的libxml库版本有关。
2.官方尚未注意到这个问题。
感觉前者的可能性较大。
所以解决方案也还是按照2中的方案进行。