xml注入漏洞

news2024/9/19 10:50:40

一、先认识XML

XML有两个先驱——SGML(标准通用标记语言)和HTML(超文本标记语言),这两个语言都是非常成功的标记语言。SGML多用于科技文献和政府办公文件中,SGML非常复杂,其复杂程度对于网络上的日常使用简直不可思议。HTML免费、简单,已经获得了广泛的支持,方便大众的使用。而XML(可扩展标记语言)它既具有SGML的强大功能和可扩展性,同时又具有HTML的简单性。

XML注入攻击也称为XXE(XML External Entity attack)漏洞,XML文件的解析依赖于libxml库,libxml 2.9及以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的XML文件时未对XML文件引用的外部实体(含外部普通实体和外部参数实体)进行合适的处理,并且实体的URL支持file://和php://等协议,攻击者可以在XML文件中声明URI指向服务器本地的实体造成攻击。

XXE漏洞一旦被攻击者利用,可以读取服务器任意文件、执行任意代码、发起DDos攻击。

在XML中引入外部实体一定要注意其安全性,需要进行严格的检查,或者禁止引入。

(1)对用户的输入进行过滤,如<、>、"、"、&等。

(2)常见的XML解析方法有DOMDocument、SimpleXML、XMLReader,这三者都基于libxml库解析XML,所以均受影响。xml_parse()函数则基于expact解析器,默认不载入外部DTD,不受影响。可以在PHP解析XML文件之前使用libxml_disable_entity_loader(true)来禁止加载外部实体(对上述三种XML解析组件都有效),并使用libxml_use_internal_errors()禁止报错。

二、XML 与 HTML 的主要差异

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息 ,而 XML 旨在传输信息。

三 、DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。 DTD如果存在那么一定会被包裹在 DOCTYPE 声明中 ,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。不过,XML对于标记的语法规定比HTML要严格地多

  1. 区分大小写,在标记中必须注意区分大小写,在XML中,<TEST>和<test>是两个截然不同的标记
  2. 要有正确的结束标记,结束标记除了要和开始编辑在拼写和大小上完全相同,还必须在前面加上一个斜杠“/”。若开始标记<test>,结束标记则为</test>。
  3. XML严格要求标记配对,HTML中的<br>、<hr>的元素形式在XML中是不合法的。当一对标记之间没有任何文本内容时,可以不写结束标记,在开始标记的末尾加上斜杠”/”来确认,例如:<test /> 这样的标记被称为“空标记”。
  4. 标记要正确嵌套,在一个XML元素中允许包含其他XML元素,但这些元素之间必须满足嵌套性
  5. 有效使用属性,标记中可以包含任意多个属性。在标记中,属性以名称/取值对出现,属性名不能重复,名称与取值之间用等号“=”分隔,且取值用引号引起来。

举子:<衣服 品牌=“耐克” 类型=“T恤” >

四、 XML基础

XML声明:<?xml version="1.0" encoding="utf-8" ?>

内部DTD声明:<!DOCTYPE 根元素名称 [元素声明]>

在DTD中定义属性:<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>

外部实体声明:<!ELEMENT 实体名称 SYSTEM “URI/URL”>

xml包括xml声明、文档类型定义(可选)、文档元素,如下图所示:

五、XML文件引用DTD的方式

  1. 内部直接定义DTD

  1. 引用外部DTD

六、xml原理

七、xml分类

① 普通xml攻击

(1)xml原理

XML注入攻击和SQL注入攻击的原理一样,利用了XML解析机制的漏洞,如果系统对用户输入"<",">"没有做转义的处理,攻击者可以修改XML的数据格式,或者添加新的XML节点,就会导致解析XML异常,对流程产生影响。

(2)攻击手段

  1. 如下XML是用于注册访问用户,其中用户名是由用户自己输入的。

  1. 攻击者在输入用户的时候,可以构造" user1 < /user> < user role=“admin”>user2"数据去拼接XML,之后整个XML字符串将会变成如下格式。这样就添加了一个管理员权限的用户。

(3)如何防御

  1. 使用白名单校验,可以使用正则的方式对用户的输入做严格的校验,比如用户输入的用户名只能含有中文,英文大小写字母,数字以及下划线等等。
  2. 使用安全的XML库,正确代码使用dom4j来构建XML,dom4j是一个定义良好,开源的XML工具库,Dom4j将会对文本数据进行XML编码,从而使得XML的原始结构和格式免受破坏。代码中最终生成的XML会进行编码,会被替换,从而防止了XML注入。
  3. 对用户输入的字段进行转码处理,代码中对传过来的参数进行了转码处理,之后去构造XML字符串,就不会导致XML字符串结构被篡改。

② XML外部实体注入攻击

(1)原理

XML外部实体注入(XML External Entity)简称XXE漏洞。

XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。

概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

(2)攻击手段

1、 利用外部实体的引用功能实现对任意文件的读取
这个是解析的xml文件,我们定义了一个通用实体,并且在文件中去引用这个实体。
password.txt文件中记录了敏感的一些信息。

具体解析代码


2. 使用参数实体和避免XML解析语法错误,构造恶意的实体解析
使用参数实体和<CDATA[]>避免XML解析语法错误,构造恶意的实体解析:
XML文件:构造参数实体 % start;% goodies;% end;% dtd 定义一个恶意的combine.dtd

恶意DTD combine.dtd中定义实体&all;

甚至可以这样构造恶意的DTD combine.dtd,将结果发送到目标地址,最后会获得file:///etc/fstab文件。

(3)防御

  1. 禁止解析DTDs
  2. 禁止解析外部实体

③内部xml实体注入

(1)原理

内部 实体攻击比较常见的是XML Entity Expansion攻击,它主要试图通过消耗目标程序的服务器内存资源导致DoS攻击。外部实体攻击和内部实体扩展攻击有不同的防护措施(禁止DTDs解析可以防护外部实体和内部实体攻击)。

(2)攻击

拒绝服务攻击
下面恶意的XML内部实体解析,占用服务器内存资源,导致拒绝服务攻击。

(3)防御

内部实体扩展攻击最好的防护措施是禁止DTDs的解析。另外也可以对内部实体数量进行限制,以消减内部实体 展攻击发生的可能性。所以在不需要使用内部实体时,应该禁止DTDs解析,需要使用内部实体时,严格限制内部实体的数量及xml内容的大小。

八、xml格式举例

<?xml version = "1.0"?>

<!DOCTYPE note [

<!ENTITY test "test">

]>

<zz>&test;</zz>

<?xml version="1.0"?>

<!DOCTYPE ANY [

<!ENTITY xxe "菜鸟" > ]>

<a>&xxe;</a>

九、靶场

在pikachu靶场中,以xxe漏洞举例:

XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

在任意在文本框中输入一个数据:a

提示: XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?

也可以使用抓包工具对其抓包,如下,发现提交的数据使用了xml格式,初步判断存在漏洞

在文本框中输入xml语句:

<?xml version="1.0"?>

<!DOCTYPE ANY [

<!ENTITY xxe "菜鸟" > ]>

<a>&xxe;</a>

构造payload,通过外部实体获取后台数据库的本地信息

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE ANY [

<!ENTITY xxe SYSTEM "file:///D://1.txt" >]>

<value>&xxe;</value>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows中vscode配置C/C++环境

首先要把MinGW的环境安装完&#xff0c;我一般是下载带有MinGW的codeblocks&#xff0c;这样省去自己安装MinGW。因为安装MinGW还挺麻烦的。 安装完codeblocks&#xff0c;找到其安装目录&#xff0c;把bin文件配置到环境变量去&#xff1a; 将bin添加到环境变量 然后打开vsco…

【MySQL高级】——索引数据结构

一、全表遍历 每个数据页一次加载搜索 二、Hash结构 1. Hash简介 2. 两种常见加快查找速度的数据结构 3. 为什么不采用Hash结构 <1> Hash索引仅能满足&#xff0c;!和IN查询。如果进行范围查询&#xff0c;哈希型的索引&#xff0c;时间复杂度会退化为o(n);而树型的“…

PLUS模型和InVEST模型生态系统服务多情景模拟预测、ArcGIS空间数据处理、空间分析与制图、土地利用时空变化

查看原文>>>基于”PLUS模型“生态系统服务多情景模拟预测实践技术应用 目录 第一章、理论基础与软件讲解 第二章、数据获取与制备 第三章、土地利用格局模拟 第四章、生态系统服务评估 第五章、时空变化及驱动机制分析 第六章、论文撰写技巧及案例分析 基于Ar…

B端产品如何搭建用户帮助体系

用户帮助体系可以提升用户的使用体验&#xff0c;引导用户正确的使用产品&#xff0c;并且体验产品的各个功能&#xff0c;B端产品因为其特殊的业务属性和复杂度&#xff0c;通常其学习成本不低。这些成本不仅仅体现在对于复杂业务概念及流程的认知方面&#xff0c;同时体现在整…

零信任网络安全:为什么越来越多的企业选择采用这一方法?

第一章&#xff1a;引言 随着信息化技术的发展和普及&#xff0c;网络安全问题日益严峻&#xff0c;黑客攻击、病毒感染、数据泄露等问题层出不穷&#xff0c;给企业带来了极大的损失。为了保障企业信息安全&#xff0c;企业采取了一系列安全措施&#xff0c;比如加强防火墙、…

【JavaScript】8.DOM的节点操作

DOM的节点操作 获取元素通常使用两种方式&#xff1a; 利用 DOM 提供的方法获取元素利用节点层级关系获取元素 利用 DOM 提供的方法获取元素 document.getElementById()document.getElementsByTagName()document.querySelector 等逻辑性不强、繁琐 利用节点层级关系获取元素 利…

vite中使用html2canvas 将img、svg和div转canvas

目录 div转canvas svg转canvas img转canvas div转canvas 使用 html2canvas 插件&#xff0c;其官网&#xff1a;html2canvas - Screenshots with JavaScripthttp://html2canvas.hertzen.com/ 安装html2canvas&#xff1a; npm i -S html2canvas 引入&#xff1a; import h…

zotero文献管理软件应用

文章目录 基础教学快速安装与入门第二部分&#xff0c;比较详细的教学与补充文献管理工具比较浏览器插件获取文献与文献pdfZotero 界面添加文件的其他方式管理题录在论文中插入引文文献同步插件与常见问题茉莉花PDFTranslator常见问题1.CNKI页面批量抓取题录失败2.文献类型标识…

Python入门教程+项目实战-11.4节: 元组与列表的区别

目录 11.4.1 不可变数据类型 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 11.4.1 不可变数据类型 不可变数据类型是指不可以对该数据类型进行修改&#xff0c;即只读的数据类型。迄今为止学过的不可变数据类型有字符串&#xff…

leetcode 494. 目标和 (01 背包

。。最近背包问题做得好崩溃 这题的解法和 分割子集、石头 差不多 分成两个集合 &#xff08;注意这里计算的时候是不带上符号的&#xff0c;只是单纯的数字 a. 正号 的数字集合 P b. 负号 的数字集合 N 所以就有以下公式 sum&#xff08;P&#xff09; sum&#xff08;N&…

XGBoost学习总结

XGBoost有两种实现&#xff0c;原生版本和Sklearn版本 &#xff0c;我选的是sklearn的主要是都用sklearn方便 参数 参数表 class xgboost.XGBRegressor ( max_depth3, learning_rate0.1, n_estimators100, silentTrue, objectivereg:linear, boostergbtree, n_jobs1, nthre…

超简单有趣的模拟算法:元胞自动机(CA)原理简介与 matlab 代码实现

很久之前就就听说了元胞自动机&#xff08;cellular automata&#xff0c;CA&#xff09;&#xff0c;但是一直没有尝试。得知2023年美赛春季赛只有两道赛题的时候&#xff0c;怕考到这个&#xff0c;所以出一篇元胞自动机的博客&#xff0c;权且当一篇学习笔记。 尝试过后才发…

亚科转债,鹿山转债上市价格预测

亚科转债 基本信息 转债名称&#xff1a;亚科转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;11.59亿元。 正股名称&#xff1a;亚太科技&#xff0c;今日收盘价&#xff1a;5.58元&#xff0c;转股价格&#xff1a;6.46元。 当前转股价值 转债面值 / 转…

SpringBoot搭建的方便易用、多租户、高颜值的教学管理平台

一、开源项目简介 硕果云&#xff0c;基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台&#xff0c;提供多租户、权限管理、考试、练习、在线学习等功能。 主要功能为在线考试、练习、刷题&#xff0c;在线学习 课程内容支持图文、视频&#xff0c;考试类型支持考试、练…

vue可视化大屏

为什么要用 mapbox ? 各位可以自行搜索上面提到的或者其他的webGIS框架或者集成服务商&#xff0c;可以很轻松的比较出mapbox的优势&#xff1a; 支持3D地形、3D模型支持多种坐标系投影mapbox studio 在线编辑地图样式&#xff0c;使用时只需一个链接&#xff0c;更新时链接…

【一篇文章学会使用从暴力法=>记忆化搜索=>动态规划以及栈的多种方法来实现LeetCode 32题最长有效括号问题】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

数字IC入门教程

第一节课 linux命令 文件命令 man 查询指令的作用 如 man cd ls 列出当前文件和文件夹的名字&#xff08;list the directory and files&#xff09; ls -a 把隐藏的文件和文件夹也显示出来 &#xff08;list all&#xff09; ls -l 把文件的属性&#xff08;读写&…

如何设置ddns动态域名实现内网发布外网

在本地搭建好服务器&#xff0c;部署好web网站或其他应用后&#xff0c;需要设置动态域名服务ddns&#xff0c;将主机的内网IP端口映射到外网访问&#xff0c;才能实现在外网访问内网。今天小编就和大家分享一下内网发布外网方案&#xff0c;即如何设置ddns动态域名服务实现外网…

Docker compose 制作 LNMP 镜像

目录 第一章.Nginx镜像 1.1安装环境部署 1.2.nginx镜像容器的配置 第二章.php镜像的安装部署 2.1.文件配置 第三章.mysql镜像的安装部署 3.1.文件配置 第四章.配置网页 4.1.进入容器mysql 4.2.浏览器访问&#xff1a; 第一章.Nginx镜像 1.1安装环境部署 systemctl s…

十四、51单片机之AD转换

1、AD相关简介 1.1、什么是AD转换&#xff1f; (1)A是指analog、模拟的&#xff1b;D是指digital、数字的。 (2)现实世界是模拟的&#xff0c;连续分布的&#xff0c;无法被分成有限份&#xff1b;计算机世界是数字的&#xff0c;离散分布的&#xff0c;是可以被分成有限份的…