免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
基本原理
XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,以下是一些 XML 的基础知识:
基本语法
- 标签:XML 使用标签来标识数据。标签由尖括号包围,例如
<tag>
。标签必须成对出现,有开始标签就必须有结束标签,如<tag>content</tag>
。也有一些自闭合标签,如<tag />
。 - 元素:元素是 XML 文档的基本组成部分,由开始标签、结束标签和标签之间的内容组成,例如
<book><title>XML入门</title></book>
中,<book>
及其包含的内容就是一个元素。 - 属性:元素可以拥有属性,属性提供了关于元素的额外信息。属性写在开始标签中,以名称 - 值对的形式出现,例如
<book id="123">
,这里id
就是属性。
文档结构
- 根元素:每个 XML 文档都必须有一个根元素,它是所有其他元素的父元素,例如:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>XML基础教程</title>
<author>张三</author>
</book>
</library>
这里<library>
就是根元素。
- 子元素:位于其他元素内部的元素称为子元素,如上述例子中
<book>
是<library>
的子元素,<title>
和<author>
是<book>
的子元素。
.
XML文档必须有根元素
lXML文档必须有关闭标签
lXML标签对大小写敏感
lXML元素必须被正确的嵌套
lXML属性必须加引号
Xml格式校验:DTD(自动对xml内容进行校验)
可以是一个独立的文件也可以是在xml内声明
XML实体
1.内部实体
ELEMENT:定义 元素
ENTITY :定义被引用的实体(全局变量)
内部实体 :内部实体是在 XML 文档内部定义的实体,它是一个在文档内部声明的实体引用,定义和使用都在同一个 XML 文档中。
<!ENTITY 实体名称 "实体的值">
- <!ENTITY:这是声明实体的关键字。
- 实体名称:用户自定义的实体标识,用于在文档中引用该实体。
- 实体的值:实体所代表的实际内容,可以是文本、字符等。
INTERNAL[ɪnˈtɜːnl]ENTITY
通过在xml中定义内部实体cs=changsha
2.外部实体
外部实体 :外部实体是指其定义存放在外部文件中的实体,XML 文档通过引用外部文件来使用该实体的内容。外部实体可以引用本地文件或网络上的资源。EXTERNAL[ɪkˈstɜːnl]ENTITY
<!ENTITY 实体名称 SYSTEM "外部文件的 URI">
- <!ENTITY:声明实体的关键字。
- 实体名称:自定义的实体标识,用于在文档中引用该实体。
- SYSTEM:表示引用的是一个外部系统资源。
- 外部文件的 URI:指向外部文件的统一资源标识符,可以是本地文件路径(如 file:///path/to/file.txt)或网络 URL(如 http://example.com/file.txt)。
通过引用D盘来的外部实体
3.相关协议
PHP 相关
php://filter/read=convert.base64-encode/resource=index.php
(用 base64 编码输入)
HTTP 相关
http://wuya.com/evil.dtd
XXE 定义
如果 Web 应用的脚本代码没有限制 XML 引入外部实体,从而导致用户可以插入一个外部实体,并且其中的内容会被服务器端执行。插入的代码可能导致以下危害:
- 任意文件读取
- 系统命令执行
- 内网端口探测
- 攻击内网网站
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root> <message>&xxe;</message> </root>
在这个示例中,攻击者通过定义一个名为 xxe 的外部实体,尝试读取服务器上的 /etc/passwd 文件(该文件包含用户账户信息),并将其内容显示在 <message> 元素中。如果应用程序的 XML 解析器没有防范 XXE 攻击,就会按照攻击者的意图去读取并返回该文件的内容。
案例一:利用xxe.php模拟xxe
1.配置环境
创建流程:将xxe.php放置于D:\phpstudy_pro\WWW\xxe下然后再phpstudy中配置
打开成功
源码
<head><meta charset=utf-8>
<title>xxe测试</title>
</head>
<body>
<form action='' method='post'>xml数据:<br>
<textarea type="text" name="data"></textarea>
<br><input type='submit' value='提交' name='sub'>
</form>
</body>
<?php
date_default_timezone_set("PRC");
if(!empty($_POST['sub'])){
$data= $_POST['data'];
$xml = simplexml_load_string($data);
print($xml);
}
?>
使用 simplexml_load_string($data) 函数将用户输入的 XML 字符串解析为 SimpleXMLElement 对象。
输出解析结果:使用 print($xml); 输出解析后的 XML 数据。
所以这个页面应该可以解析内部和外部的xml实体
2.内部xml实体解析
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [
<!ENTITY company "示例科技有限公司">]>
<name>欢迎访问 &company; 的官方网站。</name>
内部实体解析成功
3.外部实体
解析成功(注意,需要修改phpstudy中localhost的php版本号为5.**否则漏洞无法复现)
4.利用外部实体探测端口
探测端口3307可以看到未开放
5.攻击网站
后续的实体(如 loll、loll1 等)都是基于前面的实体进行递归定义,通过不断重复引用前面的实体,实体值会呈指数级增长 。这种构造通常与 XML 炸弹(Billion Laughs Attack,十亿次大笑攻击)相关,恶意利用这种构造会使解析器在扩展实体时消耗大量资源,导致拒绝服务
具体案例:微信支付的SDK曝出重大漏洞(XXE漏洞) - Future.Net博客 - 博客园
案例二:xxe-lab-master
环境配置与上案例相同
1.打开网络适配器
首先确定其是否使用xml
可以看到确实是xml,根标签嵌套子标签嵌套数据
2.通过bp抓包注入外部实体
成功实现读取任意文件
案例三:Pikachu XXE漏洞
这里实验的外部实体注入,成功(探测端口,攻击网站等原理相同在pikachu中就不演示了)
案例四:通过dnslog获取子域名然后实现xxe盲打
记录成功所以当没有回显时可以使用此法
防御xxe漏洞方法
解析器配置
- 禁用外部实体解析:许多 XML 解析器默认允许外部实体解析,这会带来风险。应显式配置解析器禁用该功能,如在 Java 中,可使用如下代码:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
在 PHP 中,可以使用libxml_disable_entity_loader(true);来禁用外部实体加载。Python 中使用lxml库时,可这样设置:
from lxml import etree
xmlData = etree.parse(xmlSource, etree.XMLParser(resolve_entities=False))
- 使用安全的 XML 解析器:选择默认禁用外部实体或具备较好安全机制的解析器,如 Apache Xerces 。
输入处理
- 严格输入验证:对用户输入的 XML 数据进行校验,可利用正则表达式、XML Schema 等技术,确保数据中不包含恶意外部实体引用。例如,规定 XML 数据必须符合特定的结构和格式,不允许出现可疑的 DOCTYPE 声明或实体定义。
- 过滤与清理:仔细检查并移除 XML 数据中可能存在的恶意内容,如过滤掉敏感的关键字、特殊字符组合等。
权限管理
- 最小权限原则:确保应用程序以尽可能低的权限运行,限制其对系统资源(如文件系统、网络等)的访问能力。这样即使存在 XXE 漏洞,攻击者能造成的破坏也会被限制。
- 限制内部资源访问:避免在 XML 中直接引用敏感内部资源,同时合理设置权限,防止攻击者通过 XXE 漏洞访问到关键数据或服务。
其他措施
· 安全审计与漏洞扫描:定期对应用程序进行安全审计和漏洞扫描,借助工具(waf)发现潜在的 XXE 漏洞,并及时修复。
· 更新维护:及时更新应用程序及所依赖的 XML 解析器、库和组件,以修复已知的安全漏洞。
· 沙箱技术:将 XML 解析器置于沙箱环境中运行,限制其对系统资源的访问,从而降低漏洞被利用时造成的危害。
· 避免敏感序列化:尽量采用简单的数据格式(如 JSON),避免对敏感数据进行 XML 序列化,从源头减少 XXE 攻击的可能性。
总结
XXE(XML 外部实体注入)漏洞是 Web 应用安全领域的常见威胁。它源于 XML 解析器在处理外部实体引用时缺乏严格限制。攻击者会构造恶意 XML 文档,插入指向敏感文件或恶意资源的外部实体引用。当应用解析该文档时,就可能读取本地敏感信息,如配置文件、数据库凭证等。此外,还可能被用于发起拒绝服务攻击或远程代码执行。为防范此漏洞,开发人员应严格过滤外部实体引用,禁用不必要的实体解析功能。
(需要源代码联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)