反序列化带来的安全问题

admin 2022年5月17日02:53:44安全博客 代码审计评论6 views2088字阅读6分57秒阅读模式

这几天出了一个 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

FROM :strcpy.me | Author:strcpy

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月17日02:53:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  反序列化带来的安全问题 http://cn-sec.com/archives/1013427.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: