这几天出了一个 Java 的反序列化漏洞,影响非常广泛,亲测 jboss和 jinkens 受到影响,但是国内貌似关注的并不是很多,今天总结一下反序列化带来的问题。

Python

Python 会出问题的反序列化的方法就是pickle,下面是简单的用法

import cPickle 

data = "test"
# 序列化 
packed = cPickle.dumps(data)
# 反序列化 
data = cPickle.loads(packed)

其中 data 可以保存在文件中或者发送到另外的机器上去执行的。参考 https://blog.nelhage.com/2011/03/exploiting-pickle/

在反序列化的时候,__reduce__是声明反序列化的方法的,返回值类型有一种是元组,包含两个元素,回调函数和回调函数参数元组。这样我们就可以将恶意代码放入__reduce__里面或者是回调函数里面。

import os
import cPickle

# Exploit that we want the target to unpickle
class Exploit(object):
    def __reduce__(self):
        os.system("pwd")
        return (os.system, ('ls',))

shellcode = cPickle.dumps(Exploit())

利用场景

import os
import cPickle
a = 1
# Exploit that we want the target to unpickle
class Exploit(object):
    def __reduce__(self):
        global a
        a = 10
        os.system("pwd")
        return (os.system, ('ls',))

shellcode = cPickle.dumps(Exploit())
cPickle.loads(shellcode)
print a

最后输出的 a 已经是10了,web 环境下可以尝试进行 sql 注入。

ruby

ruby 的 web 框架 rails,也出过类似的远程代码执行的问题,poc 见 http://ronin-ruby.github.io/blog/2013/01/28/new-rails-poc.html 和 https://www.alertlogic.com/blog/cve-2013-0333-vulnerability-analysis/

原因是在将 json 转换为 yaml 数据的时候,将不可信数据代入了 eval 中,源码在 https://github.com/rails/rails/blob/v3.0.19/actionpack/lib/action_dispatch/routing/route_set.rb#L166

php

网上公开的有一个 memcached 的例子,memcached 里面的数据取出来的时候会进行反序列化,调用类里面的__toString方法,demo 代码在 https://bitbucket.org/gebl/appseccali-php/src/2ee08cd9b541?at=master

下面这个例子更巧妙一些,不是直接执行的命令,而是进行了变量覆盖,在后续调用了自己的函数,详情见 http://drops.wooyun.org/papers/10385

Java

这个安全问题的根源在于ObjectInputStream处理反序列化时接受外部输入,而又由于其他类似InvokerTransformer的类的构造函数被调用,从而造成执行,而InvokerTransformer方便的提供了根据外部输入类名函数名反射执行的作用,所以造成整个程序RCE

鉴于原作者的文章太详细了,我没什么好说的了,而且我对 Java 的了解也不是很多,就简单的贴链接吧,信息量相当大。

http://blog.chaitin.com/2015-11-11_java_unserialize_rce/

http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#thevulnerability