xxe学习笔记
什么是xxe
XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。
当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。
XML构建模块
元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
属性
属性可提供有关元素的额外信息
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
PCDATA
PCDATA的意思是被解析的字符数据(parsed character data)。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
CDATA
CDATA指的是不应由 XML 解析器进行解析的文本数据(unparesed Character Data)
在 XML 元素中,"<" (新元素的开始) 和 "&" (字符实体的开始)是非法的。
某些文本,如JavaScript代码,包含大量 "<" 或 "&" 字符。为例避免错误,可以将脚本代码定义为 CDATA。CDATA 部分在的所有内容都会被解析器忽略。CDATA 部分由 "" 结束。
XML浅浅认识
XML 指可扩展标记语言,只能用来传递数据。
语法
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明-->
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素,lang为属性-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->
·声明是可选的
·所有 XML 元素都须有关闭标签。
·XML 标签对大小写敏感。
·XML 必须正确地嵌套。
·XML 文档必须有根元素。
·XML 的属性值须加引号。
DTD
XML元素以形如
DTD语法
引入内部的dtd文件
<!DOCTYPE 根元素名称 [元素声明]>
参数实体的定义
<!ENTITY % 实体名称 "实体内容">
可以结合伪协议来运用
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
%file;
]>
%file(参数实体)是在DTD中被引用的,而&file;是在xml文档中被引用的。
XXE注入(XML 外部实体注入)
定义
XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
危害
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
漏洞造成
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
XML用实体引用(entity reference) 替换特殊字符
XML元素,例如
例题_BUU XXE COURSE 1
[NCTF2019]Fake XML cookbook
XML注入
利用方式
简单来说就是用户能够控制xml文件的输入,攻击者可以通过令语句闭合来改写语句,从而达成目的。
<?xml version="1.0" encoding="utf-8" ?>
<USER>
<user Account="admin">用户输入</user>
<user Account="root">root</user>
</USER>
当我们输入admin
<?xml version="1.0" encoding="utf-8" ?>
<USER>
<user Account="admin">admin</user>
<user Account="hacker">hacker</user>
<user Account="root">root</user>
</USER>
这样就添加了一个名为hacker的用户。