网络安全/渗透测试/代码审计/
关注
浅谈XXE漏洞
介绍
现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。举个例子,我们扫一眼这些网站最近奖励的漏洞,充分证实了前面的说法。尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应得的关注度。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。
XML基础知识
XML
用于标记电子文件
使其具有结构性
的标记语言
,可以用来标记数据
、定义数据类型
,是一种允许用户对自己的标记语言进行定义的源语言。XML
文档结构包括XML声明
、DTD
文档类型定义(可选)、文档元素。
如果你了解XML
,你可以把XML
理解为一个用来定义数据
的东东。因此,两个采用不同技术的系统可以通过XML
进行通信
和交换数据
。
比如,下面的代码就是XML的基础结构:
代码语言:javascript复制 <!--XML声明-->
<?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>Hacker</to>
<from>Power_Liu</from>
<heading>Reminder</heading>
<body>Hack it, you must be Know it,Know it then Hack it。<body/>
</note>
DTD是什么?
DTD
(文档类型定义)的作用是定义XML
文档的合法构建模块
。DTD
可以在XML
文档内声明,也可以外部引用
。
内部声明DTD
格式:
代码语言:javascript复制<!DOCTPYE 根元素 [元素声明]>
引用外部DTD
格式:
代码语言:javascript复制<!DOCTYPE 根元素 SYSTEM "文件名">
或者:
代码语言:javascript复制<!ENTITY PUBLIC "public_ID" "文件名">
在DTD中,实体声明,使用ENTITY关键字声明。实体,用来定义应用普通文本或特殊字符的快捷方式的变量。实体,可以内部,或外部进行声明。
内部声明实体格式:
代码语言:javascript复制<!ENTITY 实体名称 "实体值">
引用外部的实体格式:
代码语言:javascript复制<!ENTITY 实体名称 SYSTEM "引用外部的url">
<!ENTITY 实体名称 public_ID "引用外部的url">
XXE外部实体注入(XML External Entity)
当运行引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
(1)恶意引入外部实体方式1:
读取
系统passwd
文件
(2)恶意引入外部实体方式2:
调用外部实体URL
,其中evil.dtd
就是恶意文件,内容可以写成上面的那种
(3)恶意引入外部实体方式
支持的协议:
libxml2
file、http、ftp
PHP
file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
JAVA
http、https、ftp、file、jar、netdoc、mailto、gopher
.NET
file、http、https、ftp
XXE漏洞的危害:
读取任意文件(数据回显):
任意文件读取(数据不回显):
#print_r($data);
这个是不让数据回显到客户端,让回显的数据发送到远程服务器的192.168.1.122/evil.dtd
里。
执行系统命令
内网端口探测
内网的渗透测试
防御XXE攻击:
方案一:使用开发语言提供的禁用外部实体的方法
php:
代码语言:javascript复制libxml_disable_entity_loader(true);
其他语言:百度上有详细的说明文档
方案二:过滤用户提交的XML数据
关键词有:SYSTEM、PUBLIC
XXE漏洞的演示:
用BurpSuite
抓包然后再数据包下面填写恶意的XML代码实现读取etc/passwd
文化内容
未完待续… …