首页 > 编程知识 正文

java加密解密算法,java接口加密

时间:2023-05-04 17:04:58 阅读:41203 作者:1440

便利永远是安全的敌人

你的知识面决定你的攻击面

1概述

XML外部实体攻击漏洞(xe )是指XML外部实体攻击的漏洞。 XML外部实体攻击是对解析XML条目的APP应用程序的攻击。 当XML输入较弱配置的XML解析器处理包含对外部实体的引用时,会发生此攻击。 这种攻击通过构建恶意内容,可能会导致读取任意文件、执行系统命令、检测内部网端口、对内部网站点的攻击等危害。

目前,越来越多的WEB程序发现和报告XXE漏洞,包括facebook和paypal。 许多XML解析器默认包含XXE漏洞。 也就是说,开发人员有责任确保这些程序不受此漏洞的影响。 XXE的漏洞已经存在很多年了,但他从未得到过他的关注度。 其理由是,一方面不重视XXE这样的高使用难度漏洞,另一方面,XML的存在对互联网产生了广泛的影响,因此在他发生什么问题时需要对相关的APP应用程序、文档、协议、图片等进行适当的更改。

2XML结构介绍

要了解XXE的漏洞,请先学习XML的基础知识。

XML是一种非常受欢迎的标记语言,在20世纪90年代后期首次标准化,被无数软件项目采用。 这包括配置文件、OOXML、ODF、PDF、RSS、图像格式(SVG、EXIF标头)、网络协议(WebDAV、CalDAV、XMLRPC、SOAP、XMPP

XML旨在传输和存储数据,其焦点是数据的内容,是一种独立于软件和硬件的信息传输工具,旨在将数据与HTML分离。 XML文档有自己的格式规范。 此格式规范由称为文档类型定义(dtd )的内容控制,如下所示:

上面的DTD定义了XML的根元素是消息,元素下面有子元素。 其中DOCTYPE是DTD的声明。 实体是实体的声明,实体可以理解为变量; 系统、公共是外部资源的申请。 那么,XML必须写如下。

我现在理解了XML实体的定义,但实体还没有分类。 从两个角度可以将XML分为两种共计四种类型。 (内部实体、外部实体)、)通用实体、参数实体)。 其中两个类别包含了重复的地方。

内部实体:

(DTD定义代码)

(参考代码)

使用xxe引用上面定义的xxe实体,到时候输出的话,xxe会被替换为“test”。 内部实体是在一个实体中定义的另一个实体,也就是嵌套定义。

外部实体:

外部实体表示外部文件的内容,由SYSTEM关键字表示,通常以文件名或public_ID文件名的形式引用外部实体。

一些XML文档包含由系统标识符定义的实体,这些文档显示在DOCTYPE标题中。 这些定义的实体可以访问本地或远程内容。 如果用户可以控制SYSTEM的后续内容,用户可以随意替换其他内容,并选择服务器本地文件(file:///etc/passwd )或远程文件) http://www.Baidu

通用实体:

使用实体名称; 中选择所需的墙类型。 他在DTD中定义,并在XML文档中引用

参数实体:

a .使用dtd中定义的%实体名称。 %实体名称仅可用于dtd; 引用

b .参数实体声明只能在DTD文件中引用其他实体

c .与一般实体一样,也可以外部引用参数实体

3常规XML注入

在介绍XXE之前,首先简单介绍一下普通的XML注入。 为什么要提到XML注射呢? 从XXE的全名(XML外部实体注入)可以看出,XXE也是一种XML注入,只是注入了XML外部实体。

如上图所示,XML注入是指在用户通过XML输入的位置插入自己的XML代码,具体取决于输入位置上下文的标记状态。 由于普通XML注入的使用面很窄,所以在现实中很少使用,但是既然可以插入XML代码,为什么不能插入XML外部实体,如果注入成功解析成功,我的XML注入的攻击面就会大幅扩大于是XXE出现了

4从回显读取本地敏感文件(正常xxe ) ) ) ) ) )。

该攻击场景模拟了服务端可以通过接收和分析XML格式的输入,并在有回显的情况下输入我们自定义的XML代码,从外部引用实体,来浏览服务上的文件。

首先,它显示了在服务器端解析XML的php代码

xxe.php

libxml_disable_ent

ity_loader (false);

$xmlfile = file_get_contents('php://input');

$dom = new DOMDocument();

$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);

$creds = simplexml_import_dom($dom);

echo $creds;

?>

其中libxml_disable_entity_loader(BOOL)函数接收true或false两种布尔型参数,用来表示是否允许禁用外部加载实体,当值为false时允许加载外部实体;

通过file_get_contents()加载传入的参数,再通过DOMDocument类中的loadXML函数加载外部传入的实体(XML),最后将结果返回显示

因此我们构造一个XML外部实体,用来访问服务器上的敏感文件,然后再数据传输过程中将自己的实体注入。

Payload:

]>

&xxe;

结果如下:

当然,回显注入属于是例外中的例外,毕竟XML本身就不是输出用的,一般都是用于配置或者某些极端情况下利用其它漏洞能恰好实例化解析XML的类,因此想要利用现实中更真实的XXE漏洞需要寻找一个不依靠回显的方法-----外带

5无回显读取本地敏感文件(Blind OOB XXE)

想要外带就必须能发起请求,那么什么地方能发起请求呢?很明显就是我们的外部实体定义的时候,其实光发起请求还不行,我们还得能把我们的数据传出去,而我们的数据本身也是一个对外的请求,也就是说,我们需要在请求中引用另一次请求的结果,分析下来只有我们的参数实体能做到了(并且根据规范,我们必须在一个 DTD 文件中才能完成“请求中引用另一次请求的结果”的要求)。照例给出存在问题的服务端代码。

xxe.php:

libxml_disable_entity_loader (false);

$xmlfile = file_get_contents('php://input');

$dom = new DOMDocument();

$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);

?>

可以看到这个服务器配置与上一个相比取消了回显,但是依然是不安全的。

Payload:

%remote;%int;%send;

]>

再提交数据的时候引用另一个DTD文件,test.dtd将服务器上的敏感文件进行base64编码后转发给攻击者ip:9999端口上

test.dtd:

">

结果如下:

我们从 payload 中能看到 连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %),我们再调用 %send; 把我们的读取到的数据发送到我们的远程主机上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

进一步对XXE漏洞分析后,我们可以很清晰地看到我们实际上都是通过file协议读取本地文件,或者通过http协议发出请求,类比一下其他漏洞例如SSRF,发现这两种漏洞的利用方式非常相似,因为他们都是从服务器向另一台服务器发起请求,所以想要更进一步的利用XXE漏洞我们要清楚在何种平台可以使用何种协议

6XXE的真实案例(微信支付XXE)

在2018年7月4日微信SDK爆出XXE漏洞,通过该漏洞,攻击者可以获取服务器中目录结构、文件内容,如代码、各种私钥等。获取这些信息以后,攻击者便可以为所欲为。

漏洞描述:

微信支付提供了一个接口,供商家接收异步支付结果,微信支付所用的java sdk在处理结果时可能触发一个XXE漏洞,攻击者可以向这个接口发送构造恶意payloads,获取商家服务器上的任何信息,一旦攻击者获得了敏感的数据 (md5-key and merchant-Id etc.),他可能通过发送伪造的信息不用花钱就购买商家任意物品

漏洞产生原因:

微信支付SDK的XXE漏洞产生原因都是因为使用了DocumentBuilderFactory没有限制外部查询而导致XXE

漏洞实例代码:

简单的代码审计一下可以发现,在构建了documentBuilder以后对传进来的strXML直接进行解析,并没有任何过滤检查的步骤,而且悲剧的是此处传入的参数是攻击者可控的注入点,于是就出现了XXE漏洞。

简化版:

完整代码:

攻击代码:

直接向其中注入XML外部实体,返回c盘上的系统配置文件内容,由于可以直接回显所以采用了最简单的回显注入而不是外带注入

7XXE漏洞防御

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

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数据

过滤关键词:!ENTITY,或者SYSTEM和PUBLIC

3.使用第三方应用代码及时升级补丁

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。