xxe的攻击及防御

xml文档的基础组成

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

 

DTD实体

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

 

实体又分为一般实体和参数实体

1,一般实体的声明语法:<!ENTITY实体名 "实体内容“>

引用实体的方式:&实体名;

2,参数实体只能在DTD中使用,参数实体的声明格式:<!ENTITY % 实体名 "实体内容“>

引用实体的方式:%实体名;

1,内部实体声明: ex:<!ENTITY eviltest"eviltest">

完整实例:

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>

<test>&writer;&copyright;</test>

2,外部实体声明:

完整实例:

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY writer SYSTEM "
http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "
http://www.w3school.com.cn/dtd/entities.dtd">
]>

<author>&writer;&copyright;</author>

在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

1XXE:

xxe也就是xml外部实体注入。

即通过通过DTD外部实体声明,输入恶意代码,进行攻击;

 

攻击方法:

 

方式一:直接通过DTD外部实体声明

XML内容

 

方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明

XML内容:

DTD文件内容:

 

方式三:通过DTD外部实体声明引入外部实体声明

好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明

具体看例子,XML内容

dtd文件内容:

 

3,支持的协议有哪些?

不同程序支持的协议如下图:

其中php支持的协议会更多一些,但需要一定的扩展支持。

 

4、产生哪些危害?

 

XXE危害1:读取任意文件

 

该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

另外,数据不回显就没有问题了吗?如下图,

不,可以把数据发送到远程服务器,

远程evil.dtd文件内容如下:

触发XXE攻击后,服务器会把文件内容发送到攻击者网站

 

 

XXE危害2:执行系统命令

 

 

该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

 

XXE危害3:探测内网端口

 

该CASE是探测192.168.1.1的80、81端口,通过返回的“Connectionrefused”可以知道该81端口是closed的,而80端口是open的。

 

XXE危害4:攻击内网网站

 


该CASE是攻击内网struts2网站,远程执行系统命令。

如何防御xxe攻击:

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

PHP
libxml_disable_entity_loader(
true);

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(
false);

Python
from lxml
import etree
xmlData = etree.parse(xmlSource,etree.
XMLParser(resolve_entities=False))

 

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

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

 

 

 

源文档 <https://www.cnblogs.com/r00tuser/p/7255939.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值