【CTF】XXE 入门

XXE入门

训练平台

Pikachu:链接
WebGoat:链接

XXE(XML External Entity Injection)

即”XML外部实体注入漏洞”,这是一个注入类型的漏洞,那我们一句话就可以想到 “输入做过滤,输出做转移”
简单的说,就是 攻击者通过向服务器注入指定的XML实体内容, 从而让服务器按照攻击者指定的配置进行执行, 从而导致问题”
那么,漏洞利用需要的两个条件就很明确了:

  1. 服务端接收和解析了来自用户端的xml数据。(很多语言里面对应的解析XML的函数默认是禁止解析外部实体内容,从根本上避免了该漏洞)
  2. 服务端对上述XML数据没有做严格的安全控制(例如过滤)

什么是XML?

参考:链接
英文名:Extensible Markup Language,也是一种标记语言(e.g. HTML)主要将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机文字编码。

用途

XML被广泛用来作为跨平台之间交互数据(传输数据)的形式,主要针对数据的内容(存储数据),通过不同的格式化描述手段(XSLT,CSS等)可以完成最终的形式表达(生成对应的HTML,PDF或者其他的文件格式)。简单来说,就是存储数据的一种格式,e.g. JSON。

结构

这是一个XML例子:
XML例子

主要由以下三部分组成:

  1. XML声明
  2. DTD(Document Type Definition,文档类型定义)
    可以理解为一个专门定义全局变量的区域,在其中可以定义实体(Entity)。
    实体根据类型可分为:
  • 内置实体 (Built-in entities)
  • 字符实体 (Character entities)
  • 通用实体 (General entities)
  • 参数实体 (Parameter entities)
    根据引用方式可分为:
  • 内部引用(格式:<!ENTITY 实体名称 "实体的值">
  • 外部引用(格式:<!ENTITY 实体名称 SYSTEM "URI">
    注意,这个外部的含义,是相对于这个XML文档来说,只要不是这个文档的,就算外部,而不是特定要其他网络上服务器的
  1. 文档元素/正文

看懂XML外部实体

字真难看
注意,图中file://协议,主要就是用于访问本地(相对于服务端)文件的。
不同的URI:

举个栗子🌰

接受XML的一个API

对XML内容的处理,使用函数simplexml_load_string(),将形式良好,符合规范的XML字符串转换为 SimpleXMLElement对象。问题就出在PHP解析XML使用libxml,而后者在2.9.0版本之前,没有禁止解析XML外部实体内容。

对XML内容的处理

Pikachu XXE练习:链接

练习一下

《API调用》:链接

CTF Blind XXE