网络安全/渗透测试/代码审计/
关注
浅谈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文化内容
未完待续… …


