java攻击_【技术分享】如何攻击Java反序列化过程

86641

预估稿费:200RMB

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

一、前言

现在反序列化(deserialization)漏洞早已不是新鲜事物(如这几处参考资料[1][2][3][4]),但与其他类别漏洞相比,反序列化漏洞的利用过程涉及更多方面的因素。在应邀对客户进行渗透测试时,我成功利用Java反序列化漏洞获得了某台服务器的权限,利用这台服务器,我获得了数十台服务器的root访问权限,这些服务器横跨多个数据中心,部署了各种预生产以及生产环境。在之前多次渗透测试中,安全人员都没有发现过这个漏洞,如果我之前没接触过Java序列化及反序列化方面的知识,我肯定也会错过这个漏洞。

在本文中,我会尝试理清大家对反序列化漏洞的一些误解及困扰,希望能通过工具的使用来降低反序列化漏洞利用的技术门槛。我主要针对的是Java语言,但所涉及的原理同样也适用于其他语言。此外,我会重点分析命令执行的利用方法,以保持主题的简洁性。

今年早些时候,我在SteelCon上讨论过这个话题,后面我还会在BSides Manchester以及BSides Belfast上讨论同一话题,此外,在今年的44con上,我会讨论另一个Java后门。

二、序列化及反序列化

简而言之,序列化就是将运行时的变量和程序对象转换为可被存储或传输形式的一种过程。反序列化是一个相反的过程,可以将序列化形式的数据转换回内存中的变量及程序对象。经过序列化的数据可以存储为文本格式的数据,如JSON或者XML,也可以存储为二进制格式的数据。包括C#、Java以及PHP在内的许多高级语言本身就支持数据序列化,操作起来非常便捷,使开发者不必自己去实现这一过程,大大减轻开发者的工作量。在本文中,我重点分析的是Java内置的序列化格式,但其他数据格式也可能面临类似的风险(大家可以参考Alvaro Muñoz和Oleksandr Mirosh在Black Hat USA 2017以及Def Con 25上关于JSON攻击的演讲来了解更多技术细节)。

2.1 问题所在

序列化和反序列化的应用本身并不存在问题。但当用户(或者攻击者)可以控制正在反序列化的数据时,问题则随之出现。比如,如果数据使用网络渠道投递给反序列化处理过程,那么当攻击者可以控制被反序列化的数据时,此时内存中的变量及程序对象就会受到一定程度的影响。随后,如果攻击者可以影响内存中的变量以及程序对象,与这些变量及程序对象有关的代码执行流程就会受到影响。我们来看一下Java反序列化的例子:

public class Session {

public String username;

public boolean loggedIn;

public void loadSession(byte[] sessionData) throws Exception {

ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(sessionData));

this.username = 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值