XXE漏洞学习笔记+靶场实战
一、关于XML和XXE的基础知识
XXE全称XML,也就是XML外部实体注入攻击,是对非安全的外部实体数据进行处理时引发的安全问题。要想搞懂XXE,一定要先了解XML语法规则和外部实体的定义及调用形式。
XML基础知识
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。XML语法规则:
1.所有的XML元素都必须有一个关闭标签;
2.XML标签对大小写敏感。
3.XML必须正确嵌套。
4.XML属性值必须加“”。
- XML被设计为传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
XML基本文档结构
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->
<foo>&xxe;</foo>
xml元素介绍
XML元素是指从开始标签直到结束标签的部分。每个元素又有对应的属性,XML属性必须加引号。
注意:
-
XML文档必须有一个根元素。
-
XML元素必须有一个关闭标签
-
XML标签对大小写敏感
-
XML元素必须被正确的嵌套。
-
XML属性值必须加引号
XML DTD介绍
DTD文档类型定义,约束了xml文档的结构。拥有正确语法的XML被称为“形式良好”的XML,通过DTD验证约束XML是“合法”的XML。
DTD含义
XML文档有自己的一个格式规范,这个格式规范是由一个叫做DTD文档类型定义的东西控制的。
DTD用来描述xml文档的结构,一个DTD文档包含:
- 元素的定义规则
- 元素之间的关系规则
- 属性的定义规则
DTD可被成行地声明于xml文档中,也可作为一个外部引用。
内部的DOCTYPE声明
内部声明DTD类型声明:
引用外部实体:
我们主要关注XML外部实体的定义和调用方式:
<!ENTITY 实体名称 SYSTEM "URL">实例:
<?xml version="1.0"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
<to>you</to>
<from>are</from>
<head>very</head>
<body>good!</body>
</note>
test.dtd
<!ELEMENT to (#PCDATA)>
<!ELEMNET from (#PCDATA>
<!ELEMENT head (#PCDATA)>
<!ELEMENT body (#PCDATA)>
- PCDATA的意思是被解析的字符数据。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。
DTD实体介绍
实体定义:实体是用于定义引用普通文本或者特殊字符的快捷方式的变量。
在DTD中的实体类型,一般分为:内部实体和外部实体,细分又分为一般实体和参数实体。除外部参数实体引用以字符(%)开始外,其他参数实体都以字符(&)开始,以字符(;)结束。
内部实体:
<!ENTITY 实体名称 ”实体的值">外部实体:
<!ENTITY 实体名称 SYSTEM "URl/URL">外部参数实体:
<!ENTITY % 实体名 “实体内容">该类型的实体用“%”字符声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容:
示例:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE demo [
<!ENTITY % first "Hello">
<!ENTITY % second "&first;_world">
%second;]>
XML注入漏洞(XXE漏洞)
XXE漏洞原理
XXE漏洞全称XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的XML文件进行过滤,导致可以上传恶意的XML文件。
通常攻击者会将payload注入XML文件中,一旦文件被执行,将会读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。换而言之,XXE是一种从本地到达各种服务的方法。此外,在一定程度上这也可能帮助攻击者绕过防火墙规则过滤或身份验证检查。
常见的XXE漏洞类型
- 基础的XXE注入——外部实体注入本地DTD
- 基于盲注的XXE注入——xml解析器在响应中不显示任何错误。、
- 基于错误的XXE注入——成功解析之后,XML解析器始终显示SAME响应。(您的消息已被接收)。因此,我们可能希望解析器将文件的内容“打印”到错误响应中。
XXE漏洞危害
- 任意文件读取
- 探测内网地址
- 通过DTD窃取文件
- 远程代码执行
XXE漏洞的防御
方案:使用开发语言提供的禁用外部实体的方法。
1.PHP:
libxml_disable_entity_loader(true);
2.JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
3.Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
靶场实战
pikachu靶场
pikachu靶场简介
Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。
XXE漏洞利用进行文件读取
我们首先在本地进入网站,选择XXE模块
构造利用payload
将payload填入输入框进行提交
可见我们提交的内容显现在了页面。
我们在D盘下新建一个1.txt文件,内容为:
然后构造利用代码:
提交,我们可以成功读取到本地1.txt文件的内容
CTF-jarvisoj(xxe)
我们进入题目,发现有一个输出框
我们输入任意内容然后进行抓包
将Content-Type的值改为application/xml,然后提交xml发现能够被解析
我们构造payload读取目标机器/home/ctf/flag.txt中的flag值。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///home/ctf/flag.txt" >
]>
<root>
<name>&xxe;</name>
</root>
可以看到成功读取。
BWAPP (XXE部分)
我们先点击黑体字获取XXE攻击脚本。

然后使用Burp抓包后发送到Repeater模块
第一次我们使用http协议读取robots.txt文件内容
第二次我们使用php协议读取 xml页面中的内容
用file协议读取本机的/etc/passwd的内容
来源:CSDN
作者:shu1L
链接:https://blog.csdn.net/weixin_45744757/article/details/104455776