这几天出了一个 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())
利用场景
-
Django 框架在使用 cookie based session 的时候,会把 session 的内容 pickle 之后使用 secret_key 加密签名然后通过设置 cookie 的方法存在浏览器里面,在 secret_key 不泄露的情况下是不存在问题的,因为你即使修改了数据为恶意代码仍然是无法解密的,而一旦 secret_key 泄露,用户可以重新加密签名然后提交到服务器,这样就造成了安全问题。详情见http://rickgray.me/2015/09/12/django-command-execution-analysis.html
-
在部分无法执行命令的场景下,我们可以修改变量,更改执行流程等。
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