前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战挖掘文件导入处的XXE漏洞

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

作者头像
Khan安全团队
发布2021-07-08 11:41:24
2.3K0
发布2021-07-08 11:41:24
举报
文章被收录于专栏:Khan安全团队

一、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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Khan安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、XXE简述
  • 二、测试过程
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档