首页 > 其他分享 >XXE(xml外部实体攻击)

XXE(xml外部实体攻击)

时间:2023-04-26 15:47:34浏览次数:44  
标签:xml XML 外部 实体 DTD 攻击 文档 XXE

1、概念

XXE(XML External Entity)是指xml外部实体攻击漏洞。XML外部实体攻击是针对解析XML输入的应用程序的一种攻击。当包含对外部实体的引用的XML输入被弱配置XML解析器处理时,就会发生这种攻击。这种攻击通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
(简单来说,XXE就是XML外部实体注入。当应用程序允许引用外部实体时,通过构造恶意内容,就可以导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。)

2、文档的基础组成

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素;

3、漏洞原理

3.1、DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

3.1.1、内部的 DOCTYPE 声明:

<!DOCTYPE 根元素 [元素声明]>

 

3.1.2、外部的 DOCTYPE 声明:

<!DOCTYPE 根元素 SYSTEM “文件名”>

这是包含 DTD 的 “note.dtd” 文件

 

3.1.3、DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。

DTD内部实体声明:
<!ENTITY 实体名称 “实体的值”>

 DTD外部实体声明:
<!ENTITY 实体名称 SYSTEM “URI/URL”>

 

4、XML外部实体

XML,可拓展的标记语言,(eXtensible Markup Language),用于传输和存储数据。
XML文档实例:

 

4.1、XML“外部实体”实例:

 

 可以在DOCTYPE头部标签中通过SYSTEM关键字定义“实体”,这些“实体”可以访问本地或远程的内容。SYSTEM告诉XML解释器,从URI中读取实体的内容。攻击者可以通过实体将自定义的值发送给应用程序,然后让应用程序去呈现,比如上面就是把实体定义为passwd文件,让XML解释器去读取文件。

4.1.1、攻击方法:

**方式一:**直接通过DTD外部实体声明
XML内容

 DTD文件内容:

 **方式三:**通过DTD外部实体声明引入外部实体声明
好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
具体看例子,XML内容

 dtd文件内容:

 5、如何发现XXE漏洞
5.1、寻找XML输入点
比如Content-Type:text/xml, post的数据包含XML格式,如:
<forgot><username>admin</username></forgot>
请求头中添加Content-Type:text/xml,或Content-type:application/xml
同时,POST中添加payload

 5.2、 通过关键字,在代码中查找XML解释器,确认解释器是否针对此漏洞做了安全限制(禁用外部实体、过滤关键字等)

关键字:DocumentBuilderFactory等

6、危害:

6.1.任意文件读取(如上)

 通过提交自动以URI,可以读取任意文件(本地或远程)。
还可以通过DTD文档引入外部DTD文档,再引入外部实体声明,如下:

 以上输入有回显的情况,/etc/passwd可以直接被显示出来,无回显的情况,需要把文件外发至远程服务器,具体如下:

 

6.2、拒绝服务攻击

原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

 6.3、测试后端服务器的开放端口

通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

6.4、后端WEB漏洞如果可以通过URL加以利用,可造成WEB漏洞攻击

 6.5、命令执行

 PHP要开启PECL上的Expect扩展。
危害:
可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害

7、防御:
7.1、使用开发语言提供的禁用外部实体的方法
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))

7.2、过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

7.3、使用第三方应用代码及时升级补丁

标签:xml,XML,外部,实体,DTD,攻击,文档,XXE
From: https://www.cnblogs.com/aidy/p/17356252.html

相关文章

  • ajax中responseText与responseXML区别
    源:http://lou888.blog.hexun.com/46543491_d.html评:一、ajax中responseText与responseXML区别1、"responseText”属性以字符串形式返回HTTP响应;“responseXML”属性以XML形式返回HTTP响应。functiongetTel(){vartelText=document.getElement......
  • mybatis xml 中 大于、小于、等于 写法
    在*.xml中使用常规的<>=<=>=会与xml的语法存在冲突使用xml原生转义的方式进行转义字符名称字符串符号转义字符大于号>>小于号<<大于等于号>=>=小于等于号<=<=与&&amp;单引号'&apos;双引号""简单代码示例:select*fro......
  • C# 序列化与反序列化XML文件
    1//整理输出数据2List<RowData>lisOutputData=newList<RowData>();3foreach(varitemindicAssist.Keys)4{5stringkey=item+dicAssist[item];6foreach(varitmindicRowNumber[key])7{8lisOutputData.Add(dicR......
  • XML Schema学习
    XMLSchema简介XMLSchena的作用是定义XML文档的划分构建模块。XMLSchema是基于XML的DTD代替者,XMLSchema可描述XML文档的结构。定义可出现在文档中的元素定义可出现在文档中的属性定义那个元素是子元素定义子元素的次序定义子元素的数目定义元素是否为空,或者是否包含文......
  • hibernate.cfg.xml配置文件简介
    1.Hibernate核心配置文件,也即hibernate.cfg.xml,还可以是hibernate.properties格式。包含了数据库连接的相关信息以及映射文件的基本信息。通常情况下,该配置文件默认放在项目的src目录下,当项目发布后,该文件会在项目的WEB-INF/classes路径下。2.常用的模板<?xmlversion="......
  • XML学习
    XML学习什么是XML?XML指可扩展标记语言(ExtensibleMarkupLanguage)。XML是一种很像HTML的标记语言。XML的设计宗旨是传输数据,而不是显示数据。XML标签没有被预定义。您需要自行定义标签。XML被设计为具有自我描述性。XML是W3C的推荐标准。XML和HTML之间的差异XML不......
  • mybatis-plus没有将XML配置文件放到classpath路径下的解决办法
    1.需求:我将mapper接口对应的xml文件没有放到resources路径下,而是放到了如下图中,导致无法识别1.1默认可以放mapper对应配置文件的位置1.2本人实际放置的mapper对应的xml文件位置2.解决:2.1第一步:在pom文件中添加如下配置<build><resources><reso......
  • MFC-CreateProcess创建一个新的进程和它的主线程并执行外部程序
     CONSTTCHARpath[]=_T("C:\\Users\\Administrator\\Desktop\\test.exe");PROCESS_INFORMATIONinfo;STARTUPINFOsi={sizeof(si)};BOOLb=CreateProcess(path,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&info);/......
  • html css 怎么导入外部css
    在HTML文件中导入外部CSS样式表,可以使用<link>标签。具体步骤如下:创建一个样式表文件(通常以.css扩展名为后缀),并将所有的CSS样式规则存放在该文件中。在HTML文件中添加一个<link>标签,指定rel="stylesheet"属性和href属性,其中href属性值应该是样式表文件的U......
  • MyBatis运行找不到xml资源文件
    MyBatis运行找不到xml资源文件运行报错:报错原因:程序运行后,没有将src/main/java目录下的资源文件(xml、properties等等)导出到target工作目录下,所以程序找不到java目录:运行后的target目录:可以看到并没有MonsterMapper.xml文件解决方法:Maven项目在pom.xml......