实战挖掘文件导入处的XXE漏洞

2021-07-08 11:41:24 浏览数 (1)

一、XXE简述

XXE(XML External Entity Injection)全称是XML外部实体注入,当服务端允许引用外部实体时,通过构造恶意payload就可能造成任意文件读取、内网端口探测甚至命令执行等危害。

知识储备,自己之前也是学的迷迷糊糊的,这次重新理一下思路。

DTD(文档定义类型),DTD可在XML内部进行声明,也可以外部引用。

代码语言:javascript复制
内部声明格式如下:
<?xml version="1.0"?>
<!DOCTYPE note [                                          #定义文档类型
 <!ELEMENT note (to,from,heading,body)>  #定义note四个元素“to,from,heading,body”
 <!ELEMENT to      (#PCDATA)>               #定义元素类型为PCDATA(会被解析的文本)
 <!ELEMENT from    (#PCDATA)>              #CDATA类型(不会被解析)
 <!ELEMENT heading (#PCDATA)>
 <!ELEMENT body    (#PCDATA)>

]>

xml要按下面的格式进行编写

代码语言:javascript复制
<note>
 <to>George</to>
 <from>John</from>
 <heading>Reminder</heading>
 <body>Don't forget the meeting!</body>
</note>

外部声明格式:

代码语言:javascript复制
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM"note.dtd">            #调用note.dtd
 
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget themeeting!</body>
</note>
note.dtd内容
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

DTD实体,实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

内部引用:

代码语言:javascript复制
XML:
<author>&writer;&copyright;</author>               #内部引用DTD实体writer和copyright
DTD:
<!ENTITY writer "BillGates">                                  #实体名称“writer” 值“Bill Gates”
<!ENTITY copyright "Copyright W3School.com.cn">

外部引用:

代码语言:javascript复制
XML:
<author>&writer;&copyright;</author>               
DTD:                                                                      #实体内容为外部实体
<!ENTITY writer SYSTEM"http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

二、测试过程

Office从2007版本引入了新的开放的XML文件格式,更改为.zip文件进行解压后即可发现相关sheet信息和[Content_Types].xml文件。

1、在某次测试中发现了模板下载和导入两个功能点

2、点击模板下载,成功下载到本地模板.xls文件,对文件进行另存为.xlsx格式,并对文件修改后缀名为.zip,解压如下:

3、向[Content_Types].xml文件中插入dnslog payload进行测试。

4、文件保存,重新压缩并重命名为.xlsx文件,上传文件,查看dnslog记录

导入完毕

Dnslog出现记录,服务端对XML进行了解析

5、由于是java的站,这里使用ftp对数据进行外带(php的站可以使用base64编码进行数据外带)

使用xxeserv工具进行测试,这个工具集成了ftp和http

链接:https://github.com/staaldraad/xxeserv

xxeserv为go编写,go build编译一下

外部实体sp2.dtd:

启动http和ftp,http默认端口2122,ftp默认端口2121

更改payload,引入外部实体(此处payload要与外部dtd相对应)

6、再次导入文件

此时ftp接收到相关信息

三、总结

文中简述了XXE漏洞基本原理和DTD类型格式,在某些文件导入的功能处也可能存在相关漏洞。

参考链接:https://www.w3school.com.cn/dtd/dtd_intro.asp

0 人点赞