漏洞经验分享丨Java审计之XXE(上)
最近在审计公司的某个项目时(Java方面),发现了几个有意思的Blind XXE漏洞,我觉得有必要分享给大家,尤其是Java审计新手,了解这些内容可以让你少走一些弯路。
Java总体常出现的审计漏洞如下:
>SQL注入
>XSS
>CSRF
>XXE
>SSRF
>CRLF注入
>远程命令执行
>反序列化
>文件上传
>任意文件删除
>文件下载
>DWR接口未授权访问
>JSONP
>URL报名单绕过
XXE简介
XXE(XML外部实体注入、XML External Entity),在应用程序解析XML输入时,当允许引用外部实体时,可以构造恶意内容导致读取任意文件或SSRF、端口探测、DoS拒绝服务攻击、执行系统命令、攻击内部网站等。
Java中的XXE支持sun.net.www.protocol里面的所有协议:http,https,file,ftp,mailto,jar,netdoc 。一般利用file协议读取文件、利用http协议探测内网,没有回显时可组合利用file协议和ftp协议来读取文件。
相关基础概念
XML&DTD
XML(可扩展标记语言,EXtensible Markup Language ),是一种标记语言,用来传输和存储数据。
DTD(文档类型定义,Document Type Definition )的作用是定义XML文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
实体ENTITY
XML中的实体类型,一般有下面几种:字符实体,命名实体(或内部实体)、外部实体(包含分为:外部普通实体、外部参数实体)。除外部参数实体外,其他实体都以字符(&)开始以字符(;)结束。
0x1):字符实体
字符实体类似html的实体编码,形如a(十进制)或者a(十六进制)。
0x2):命名实体(内部实体)
内部实体又叫命名实体。命名实体可以说成是变量声明,命名实体只能在DTD或者XML文件开始部分(<!DOCTYPE>语句中)。
命名实体(或内部实体语法):
`<!ENTITY 实体名称 "实体的值">`
如:
说明:
定义一个实体名称x 值为First Param!
&x; 引用实体x
知道以上语法后,可以使用名为foo的数据类型定义(DTD)构造如下请求:
request:
bar元素是单词“World”的别名 。看起来这样的内部实体似乎无害,但攻击者可以使用XML实体通过在实体内嵌入实体来导致拒绝服务攻击。通常被称为“ (Billion Laughs attack)十亿笑攻击 ”。某些XML解析器会自动限制它们可以使用的内存量。
如:
request:
response:
HTTP/1.0 200 OK
Hello World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World
0x3):外部普通实体
外部实体用于加载外部文件的内容。(显示XXE攻击主要利用普通实体)
外部普通实体语法:
<!ENTITY 实体名称 SYSTEM "URI/URL"
如:
0x4):外部参数实体
参数实体用于DTD和文档的内部子集中。与一般实体不同,是以字符(%)开始,以字符(;)结束。只有在DTD文件中才能在参数实体声明的时候引用其他实体。(Blind XXE攻击常利用参数实体进行数据回显)
combine.dtd的内容为:
<!ENTITY content "%parm1;%parm2;%parm3;">
说明:
上面combine.dtd中定义了一个基本实体,引用了3个参数实体:%param1;,%param2;,%param3;。
解析后<foo>…</foo>中的内容为Hello World。
XML外部实体的一些限制与解决办法
error
通常对于XXE的经典用法,用来读取文件比较直接方便,但是,也决定了能被解析的内容元素必须是XML文档。
如下面一个例子:
request:
response:
通常会得到如下响应
HTTP/1.0 500 Internal Server Error
File "file:///etc/fstab", line 3
lxml.etree.XMLSyntaxError: Specification mandate value for attribute system, line 3, column 15...
/etc/fstab是一个包含一些看起来像XML的字符的文件(即使它们不是XML)。这将导致XML解析器尝试解析这些元素,只是注意到它不是有效的XML文档。
因此,这限制了XML外部实体(XXE)在以下两个重要方面:
- XXE只能用于获取包含“有效”XML的文件或响应
- XXE不能用于获取二进制文件
XML外部实体(XXE)限制解决办法
这其实也就用到了外部参数实体,解决了命名实体和普通实体所带来的一些问题。具体如下分析:
攻击者可以通过使用一些巧妙的技巧来解决上述限制。攻击者使用XML外部实体(XXE)攻击所面临的主要问题是,它很容易撞了南墙试图exfiltrate不是有效的XML文件(包含XML特殊字符,如例如,文件明文文件时&,< and >)。
理论上的解决办法
XML已经解决了这个问题,因为有些合法的情况可能需要在XML文件中存储XML特殊字符。CDATAXML解析器忽略(Character Data)标记中的特殊XML字符。
因此,从理论上讲,攻击者可以发送类似于以下内容的请求。
request:
预期response:
但实际上并不起作用,因为XML规范不允许将外部实体与内部实体结合使用。
内部实体代码示例:
外部实体代码示例:
参数实体
然而,攻击者仍然可以扔出手里的另一张牌-——参数实体,在得到以上限制解决方法之前先理解两个重点:
重点一:
实体分为两种,内部实体和外部实体,上面我们举的例子就是内部实体,但是实体实际上可以从外部的 dtd 文件中引用,我们看下面的代码:
还是以上代码
重点二:
我们上面已经将实体分成了两个派别(内部实体和外部实体),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体)
通用实体
用&实体名:引用的实体,他在DTD中定义,在XML文档中引用。
示例代码:
参数实体
(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名;引用
(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体。
(3)和通用实体一样,参数实体也可以外部引用。
示例代码:
参数实体在我们 Blind XXE 中起到了至关重要的作用
接下来怎么做?(解决办法)
除了一般实体,这是我们到目前为止所看到的,还有参数实体。 以下是参数实体的外观。它与一般实体相同,除了它存在于DTD内部并以%作为前缀开始,以指示XML解析器正在定义参数实体(不是通用实体)。在下面的示例中,参数实体用于定义通用实体,然后在XML文档内部调用该实体。
request:
考虑到上面的示例,攻击者现在可以通过创建在attacker.com/evil.dtd上托管的恶意DTD,将上面的理论CDATA示例转换为工作攻击。
request:
解析:
当攻击者发送上述请求时,XML解析器将首先%dtd通过向
http://attacker.com/evil.dtd发出请求来尝试处理参数实体。
一旦下载了攻击者的DTD,XML解析器将加载%file参数实体(来自evil.dtd),在本例中是/etc/fstab。然后它将分别<![CDATA[ ]]>使用%start和%end参数实体将文件的内容包装在标签中,并将它们存储在另一个名为的参数实体中%all。
这个技巧的核心是%all创建一个被调用的通用实体&fileContents;,它可以作为响应的一部分包含在攻击者中。
注:请记住,攻击者可以只使用DTD内参数实体,而不是内部的XML文档。
结果是回复攻击者,文件(/etc/fstab)的内容包含在CDATA标签中。
XXE审计函数
XML解析一般在导入配置、数据传输接口等场景可能会用到,涉及到XML文件处理的场景可查看XML解析器是否禁用外部实体,从而判断是否存在XXE。部分XML解析接口(常见漏洞出现函数)如下:
以上是今天分享的内容,在下期文章中我将继续分享Blind XXE与OOB-XXE的相关知识点以及XXE防御方法等,小伙伴们不要错过哦!
漏洞经验分享丨Java审计之XXE(上)的更多相关文章
- 漏洞经验分享丨Java审计之XXE(下)
上篇内容我们介绍了XXE的基础概念和审计函数的相关内容,今天我们将继续分享Blind XXE与OOB-XXE的知识点以及XXE防御方法,希望对大家的学习有所帮助! 上期回顾 ◀漏洞经验分享丨Java ...
- Java 审计之XXE篇
Java 审计之XXE篇 0x00 前言 在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过.下面来 深入了解一下该漏洞的产生和利用. 0x01 XXE漏洞 当程序在解析XML输入时, ...
- 【面试经验分享】java面试中的那些潜规则
1.大纲 潜规则1:面试的本质不是考试,而是告诉面试官你会做什么 很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来知道 ...
- 【原创】大叔经验分享(1)在yarn上查看hive完整执行sql
hive执行sql提交到yarn上的任务名字是被处理过的,通常只能显示sql的前边一段和最后几个字符,这样就会带来一些问题: 1)相近时间提交了几个相近的sql,相互之间无法区分: 2)一个任务有问题 ...
- Java审计之CMS中的那些反序列化漏洞
Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下. 0x01 XStream 反序列化漏洞 下载源码下来发现并 ...
- 关于Java解压文件的一些坑及经验分享(MALFORMED异常)
文章也已经同步到我的csdn博客: http://blog.csdn.net/u012881584/article/details/72615481 关于Java解压文件的一些坑及经验分享 就在本周, ...
- 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
本来想分享毕业生和初级程序员如何进大公司的经验,但后来一想,人各有志,有程序员或许想进成长型或创业型公司或其它类型的公司,所以就干脆来分享些提升技能和通过面试的技巧,技巧我讲,公司你选,两厢便利. 毕 ...
- 2019年京东Java研发岗社招面经(面试经历+真题总结+经验分享)!
本篇先以日历形式回顾秋招之路,方便各位参考某厂的处理进度:然后是总结归纳春秋招Java面试题库:最后做个总结还有展望,开始新的征程~ 面试经历京东面试真题面试经验分享1.面试经历 2018年的冬季特别 ...
- Java这样学,Offer随便拿,学习方法和面试经验分享
Java这样学,Offer随便拿,学习方法和面试经验分享 学习中:https://mp.weixin.qq.com/s/iSutLzqCiPMWwm_Rm_2oPw
随机推荐
- Linux ftrace框架介绍及运用
目录: 1. ftrace背景 2. 框架介绍 3. 主要代码分析 4. ftrace的配置和使用 5. ftrace相关工具 在日常工作中,经常会需要对内核进行Debug.或者进行优化工作.一些简单 ...
- YII框架组件CListView实现分页
效果是普通分页就不截图了... C控制器方法如下: $criteria=new CDbCriteria; $criteria->condition = "`status`={$newS ...
- JavaScript单线程和异步机制
随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时 ...
- jQuery学习之旅 Item8 DOM事件操作
1.jquery页面载入事件 1.传统加载事件 <body onload="函数名()"> 页面全部html和css代码加载完成之后再调用指定的onload函数 win ...
- fixed 和 absolute 定位的区别
fixed:固定定位 absolute:绝对定位 在没有滚动条的情况下两者其实没有差异.但是在有滚动条后,fixed始终会在定好的位置不动,而absolute会随参照对象元素的宽高 ...
- BZOJ_3626_[LNOI2014]LCA_离线+树剖
BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度, ...
- BZOJ_1774_[Usaco2009 Dec]Toll 过路费_floyd
BZOJ_1774_[Usaco2009 Dec]Toll 过路费_floyd 题意: 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一 ...
- XMR挖矿教程
XMR挖矿教程 XMR介绍 门罗币(Monero,代号XMR)是一个创建于2014年4月开源加密货币,它着重于隐私.分权和可扩展性.与自比特币衍生的许多加密货币不同,Monero基于CryptoNot ...
- 计算机17-3,4作业F
F.complete number problem with formatted output Description 同题目E Input N Output complete numbers w ...
- mysql服务设置远程连接 解决1251 client does not support ..问题
在docker里面创建mysql容器后设置的密码在远程主机连接时候出现错误: 一.如果是在docker里面安装的mysql镜像则需要先进入mysql里面:参考上一篇:https://www.cnblo ...