java反序列化_反序列化问题的研究之java篇

博客园很早就开通了,当时下决心要把自己的经验心得记录上去,但是却没有做到,因为一直觉得自己搞得东西可能还是比较的初级,感觉拿不出手,所以也就是只是把它记录在在印象笔记上面。三年下来,还是整理和收藏了一些笔记和心得,但也导致了一个问题,就是自己写起来就比较的随便,所以现在还是觉得要放到网上来,一来为了整理自己的思路,对自己这几年做的安全的一个总结和交代,二来也希望能帮助一些人少走些弯路。后续有时间把一些自认为还可以的心得体会整理并分享出来,而且发现整理以往的漏洞和笔记时候往往会有不一样的心得感悟。

700b746c18a1667ac365497f3d517e80.png

最近研究了java、php和python三种语言反序列化导致的安全问题,觉得很比较有趣,遂整理一下思路。

其中python和php的构造和触发漏洞的方法相对比较简单,java的利用和构造稍微复杂,但也是通过研究java反序列化漏洞收获也更多,感觉java的反序列化漏洞非常的典型,从中可以理解pop链的完整构造过程。

首先,在解析pop链之前,先看这样一段php的代码,

1 <?php2 $dir = $_GET["dir"];3 if (isset($dir))4 {5 echo "

";6     system("whoami".$dir);7     echo "
";8 }9 ?>

比较命令的命令注入,我们可以通过分号或者|来进行命令拼接,导致命令注入,像这样:

15daa196de86cbf1b79913c88945e669.png

最终执行了我们注入的ls命令,然后在现实的应用中基本上不会存在这么明显的漏洞,但原理基本都是一样,应用程序本意是接受用户的数据,却被别有用心的“用户”利用导致了命令执行,现实的应用复杂在可能需要通过多步骤构造最终形成命令执行,这个过程叫做POP链的构造,POP是面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链。在控制代码或者程序的执行流程后就能够使用这一组调用链做一些工作了,用链这个词形容还是比较贴切的,就好比现实中的锁链,一换扣一环,缺一不可。那么我们就针对于java反序列化中的这种POP链的构造做一个说明。

首先,在了解这个漏洞之前你需要懂一些java的基本知识,比如java的反射调用(当需要使用JVM未事先加载的class对象的时,就需要java的动态语言特性--反射机制进行动态加载)序列化(将数据结构或对象转换成二进制串的过程)和反序列化(将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程,反序列化常用于java对象的网络传输以及对象状态需要持久化)以及apache common collections这个jar包的用途。文章可以参考这里:http://blog.csdn.net/ffm83/article/details/41865869。简单来说common collections就是java内置标准集合类collection的一个补充和扩展库,丰富了一些数据结构和功能。而且很多著名的应用都用到了这个扩展包,像WebLogic、WebSphere、JBoss、Jenkins、OpenNMS,所以就危害范围来讲还是比较严重的,危害程度也是直接命令执行,boom!

受影响的版本Apache Commons Collections <= 3.2.1,<= 4.0.0。

我这里下载了3.2.1版本,下载完成之后添加到自己的工程目录下,还要下载一个源码包,便于分析程序。

like this

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值