1.XML基础
1.1.XML简介
XML被称为可扩展标记语言,与HTML类似,但是HTML中的标签都是预定义(预先定义好每个标签的作用)的,而XML语言中的标签都是自定义(可以自己定义标签的名称、属性、值、作用)的;HTML中的标签可以是单标签,而XML中的标签必须是成对出现。
1.2XML语言的作用
HTML语言主要用来展示内容,而XML语言用来传输数据
1.3XML基本语法
1.3.1XML的语法规则
XML语言严格区分大小写,而HTML语言不区分大小写;XML语言只能有一个根标签;HTML语言中的属性值可以不用引号引起来,但是XM工语言中的属性值必须用引号引起来;XML中的标签必须成对出现;
XML会对特殊字符进行实体转义,需要转义的字符如下:标签之间不能交叉编写。
1.3.2.XML文档结构
XML文档由xml声明、DTD文档类型、文档元素三部分组成。
1.3.2.1DTD文档类型
DTD文档中的关键字
DOCTYPE(DTD的声明)
ENTITY(实体的声明)
ELEMENT(定义元素)
SYSTEM、PUBLIC(外部资源申请)
1.3.2.2DTD声明类型
内部声明:<!DOCTYPE 根元素[元素声明]>
外部声明:<!DOCTYPE 根元素 SYSTEM"外部文件名">
实体声明:
参数实体用"% 实体名称"声明,引用时也用"% 实体名称";其余实体直接用实体名称声明,引用时用"&实体名称;"。参数实体只能在DTD中声明,DTD中引用;其余实体只能在DTD中声明,可以在XML文档中引用。所谓的实体就是预先定义好的数据或者数据的集合。
内部实体:<!ENTITY 实体名称"实体的值">
外部实体:<!ENTITY 实体名称 SYSTEM"URL">
参数实体:<!ENTITY %实体名称"实体的值">或者<!ENTITY 号实体名称 SYSTEM"URL">
2.XXE漏洞基础
2.1漏洞原理
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
2.2各种语言的伪协议
在引入外部实体攻击时候,我们可以使用各种语言的伪协议
|---------------|---------------------------------------------------------------|----------------------------------------------|---------------------|
| libxml2 | PHP | java | .net |
| file,http,ftp | file,http,ftp,php,compress.zlib,compress.bzip2,data,glob,phar | http,https,ftp,file,jar,netdoc,mailto,gopher | file,http,https,ftP |
file:用来加载本地文件
http:用来加载远程文件
ftp:用来访问ftp服务器上的文件
php:用来读取php源码,php://filter
2.3漏洞危害
- 探测内网端口
- 攻击内网网站
- 任意读取本地文件/远程读取文件
- 读取php源码
3.XXE漏洞利用
3.1有回显利用
3.1.1读取本地文件
以pikachu靶场为例

先尝试一下网站接口能否正常解析XML文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[<!ENTITY name "my name is qingkuang">]>
<root>&name;</root>
测试结果如下所示,输出实体的值则表明该页面是可以解析XML文档的。

尝试利用伪协议读取本地的配置文件内容
<?xml version = "1.0"?>
<!DOCTYPE name
\
\]\>
\