浅谈XML实体注入漏洞
学习了XXE漏洞,自己来总结一下,如果有什么写的不到位,不够好的地方,还请师傅们指出。
0×00 XXE漏洞
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
0×01 XML
既然说到XML,就先学习一波XML。
- XML被设计为传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
XML把数据从HTML分离,XML是独立于软件和硬件的信息传输工具。
基本语法:
- 所有 XML 元素都须有关闭标签。
- XML 标签对大小写敏感。
- XML 必须正确地嵌套。
- XML 文档必须有根元素。
- XML 的属性值须加引号。
- 实体引用,这里看个例子,如果你把字符 “
`hello `,为了避免错误。我们用实体引用`
- XML中的注释,在XML中编写注释的语法与 HTML 的语法很相似。
- 在 XML 中,空格会被保留,多个空格不会被合并为一个。
bookstore>
book category="COOKING">
title>Everyday Italiantitle>
author>Giada De Laurentiisauthor>
year>2005year>
price>30.00price>
book>
bookstore>
0×02 DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。带有DTD的XML文档实例
]>
note>
to>Y0uto>
from>@refrom>
head>v3ryhead>
body>g00d!body>
note>
当使用外部DTD时,通过如下语法引入。
外部DTD实例
note>
to>Y0uto>
from>@refrom>
head>v3ryhead>
body>g00d!body>
note>
test.dtd:
!ELEMENT to (#PCDATA)>
!ELEMENT from (#PCDATA)>
!ELEMENT head (#PCDATA)>
!ELEMENT body (#PCDATA)>
源码
- PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&,字符,需要用`&` ``实体来分别替换
- CDATA意思是字符数据,CDATA 是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD元素
DTD属性
属性声明使用以下语法
DTD实例
"H">
XML实例
payment Hu3sky="H" />
以下是属性类型的选项
默认值参数可以使用下列值:
DTD-实体(重要)
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可以在内部或外部进行声明
内部实体
"实体的值">
外部实体
"URL">
参数实体
"值">
or
"URL">
内部实体例子
]>
note>
name>&hack3r;name>
note>
结果
参数实体+外部实体
%name;
]>
`%name`(参数实体)是在DTD中被引用的,而`&name;`是在xml文档中被引用的。
XXE主要是利用了DTD引用外部实体导致的漏洞。