【CTF】XXE 入门
XXE入门
训练平台
XXE(XML External Entity Injection)
即”XML外部实体注入漏洞”,这是一个注入类型的漏洞,那我们一句话就可以想到 “输入做过滤,输出做转移”
简单的说,就是 攻击者通过向服务器注入指定的XML实体内容, 从而让服务器按照攻击者指定的配置进行执行, 从而导致问题”
那么,漏洞利用需要的两个条件就很明确了:
- 服务端接收和解析了来自用户端的xml数据。(很多语言里面对应的解析XML的函数默认是禁止解析外部实体内容,从根本上避免了该漏洞)
- 服务端对上述XML数据没有做严格的安全控制(例如过滤)
什么是XML?
参考:链接
英文名:Extensible Markup Language,也是一种标记语言(e.g. HTML)主要将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机文字编码。
用途
XML被广泛用来作为跨平台之间交互数据(传输数据)的形式,主要针对数据的内容(存储数据),通过不同的格式化描述手段(XSLT,CSS等)可以完成最终的形式表达(生成对应的HTML,PDF或者其他的文件格式)。简单来说,就是存储数据的一种格式,e.g. JSON。
结构
这是一个XML例子:
主要由以下三部分组成:
- XML声明
- DTD(Document Type Definition,文档类型定义)
可以理解为一个专门定义全局变量的区域,在其中可以定义实体(Entity)。
实体根据类型可分为:
- 内置实体 (Built-in entities)
- 字符实体 (Character entities)
- 通用实体 (General entities)
- 参数实体 (Parameter entities)
根据引用方式可分为: - 内部引用(格式:
<!ENTITY 实体名称 "实体的值">
) - 外部引用(格式:
<!ENTITY 实体名称 SYSTEM "URI">
)
注意,这个外部的含义,是相对于这个XML文档来说,只要不是这个文档的,就算外部,而不是特定要其他网络上服务器的
- 文档元素/正文
看懂XML外部实体
注意,图中file://协议,主要就是用于访问本地(相对于服务端)文件的。
不同的URI:
举个栗子🌰
对XML内容的处理,使用函数simplexml_load_string(),将形式良好,符合规范的XML字符串转换为 SimpleXMLElement对象。问题就出在PHP解析XML使用libxml,而后者在2.9.0版本之前,没有禁止解析XML外部实体内容。
Pikachu XXE练习:链接
练习一下
《API调用》:链接
CTF Blind XXE