介绍

现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。 举个例子,我们扫一眼这些网站最近奖励的漏洞,充分证实了前面的说法。尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应得的关注度。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。

XML基础知识

XML用于标记电子文件使其具有结构性标记语言,可以用来标记数据定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明DTD文档类型定义(可选)、文档元素。

如果你了解XML,你可以把XML理解为一个用来定义数据的东东。因此,两个采用不同技术的系统可以通过XML进行通信交换数据

比如,下面的代码就是XML的基础结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 <!--XML声明-->
<?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>Hacker</to>
<from>Power_Liu</from>
<heading>Reminder</heading>
<body>Hack it, you must be Know it,Know it then Hack it。<body/>
</note>

DTD是什么?

DTD(文档类型定义)的作用是定义XML文档的合法构建模块DTD可以在XML文档内声明,也可以外部引用

内部声明DTD

格式:

1
<!DOCTPYE 根元素 [元素声明]>

引用外部DTD

格式:

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

或者:

1
<!ENTITY PUBLIC "public_ID" "文件名">

在DTD中,实体声明,使用ENTITY关键字声明。实体,用来定义应用普通文本或特殊字符的快捷方式的变量。实体,可以内部,或外部进行声明。

内部声明实体格式:

1
<!ENTITY 实体名称 "实体值">

引用外部的实体格式:

1
2
<!ENTITY 实体名称 SYSTEM "引用外部的url">
<!ENTITY 实体名称 public_ID "引用外部的url">

XXE外部实体注入(XML External Entity)

当运行引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

(1)恶意引入外部实体方式1:

读取系统passwd文件

图片

(2)恶意引入外部实体方式2:

调用外部实体URL,其中evil.dtd就是恶意文件,内容可以写成上面的那种

图片

(3)恶意引入外部实体方式

图片

支持的协议:

libxml2

file、http、ftp

PHP

file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar

JAVA

http、https、ftp、file、jar、netdoc、mailto、gopher

.NET

file、http、https、ftp

XXE漏洞的危害:

读取任意文件(数据回显):

图片

任意文件读取(数据不回显):

图片

#print_r($data);这个是不让数据回显到客户端,让回显的数据发送到远程服务器的192.168.1.122/evil.dtd里。

图片

执行系统命令

图片

内网端口探测

图片

内网的渗透测试

图片

防御XXE攻击:

方案一:使用开发语言提供的禁用外部实体的方法

php:

1
libxml_disable_entity_loader(true);

其他语言:百度上有详细的说明文档

方案二:过滤用户提交的XML数据

关键词有:SYSTEM、PUBLIC

XXE漏洞测试靶场:

XXE漏洞测试靶场地址

XXE漏洞的演示:

图片

BurpSuite抓包然后再数据包下面填写恶意的XML代码实现读取etc/passwd文化内容

未完待续… …