python pickle反序列化漏洞_Python的一些高级特性以及反序列化漏洞

0x01 简述

文章主要记录一下python高级特性以及安全相关的问题

python作为脚本语言,其作为高级语言是由c语言开发的,关于python的编译和链接可以看向这里https://github.com/python/cpython(建议自己读读源码,可以更好的理解python的语言特性等。)

python标准库:

python标准库包含内置模块(有c语言实现,主要提供接入系统的基本功能,例如文件的IO),还有一些python实现的模块提供了类似于其它语言的一些标准解决方案。

python自带了内置库和第三方库的文档查看器:命令行输入:

python –m pydoc –p 8888

查看

内置模块(c语言实现)

内置模块(python实现)

第三方模块

python一般的package结构图

0x02 python的一些特性

1> __builtin__与__builtins__的区别与关系

python有一个内建模块,该模块会在python启动后,但在没有执行python代码前,会被加载到内存.即可用调用里面的函数,其中__builtin__只存在与python2.x中__builtins__在python2.x/3.x都有,是内建模块一个引用,与__builtin__相同的是也会一开始被先于程序加载到内存它们存在如下的区别:

1、在主模块main中,__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__,二者完全是一个东西,不分彼此

2、非主模块main中,__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身可以参考这篇文章: https://www.jianshu.com/p/645e97383c1f

2> 属性的__dict__

Python中的属性是分层定义的,当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现在不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。

下面用张图展示一下其中的关系

例如下面的代码:

classbird(object):

feather=Trueclasschicken(bird):

fly=Falsedef __init__(self, age):

self.age=agedefeat(self):print("eat")classmalechicken(object):

sex= "male"summer= chicken(2)print(bird.__dict__)print(chicken.__dict__)print(summer.__dict__)

输出:

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/m0rk/GitHub/Demo/request_debug.py

{'__doc__': None, '__module__': '__main__', '__weakref__': , '__dict__': , 'feather': True}

{'__doc__': None, '__module__': '__main__', 'fly': False, 'malechicken': , '__init__': , 'eat': }

{'age': 2}

Process finished with exit code 0

可参考:

http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html

http://hbprotoss.github.io/posts/python-descriptor.html

0x03 python沙箱绕过

最早的文章见这里https://hexplo.it/escaping-the-csawctf-python-sandbox/

rickgray 修改成更为通用的poc,文章见这里 http://rickgray.me/use-python-features-to-execute-arbitrary-codes-in-jinja2-templates

[x for x in [].__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('id')

0x04 反序列化漏洞

同其它语言一样,python也有序列化的功能,官方库里提供了pickle/cPickle的库用于序列化和反序列化,这两个库的作用和使用方法都是一致的,只是一个用纯py实现,另一个用c实现。

python序列化的payload如下:

#!/usr/bin/env python

importcPickleimportosclassexp(object):def __reduce__(self):

ser= """put command here"""

return(os.system, (ser,))

e=exp()

ser= cPickle.dumps(e)

当有存在漏洞的系统反序列化我们的payload的时候,命令就执行了。

0x05 其它

在这篇文章中 Python Pickle反序列化带来的安全问题(http://www.vuln.cn/8094) 作者提到了 请灵活使用google 即在google中搜索 cPickle.loads( site:github.com 既可寻找反序列化在现实中的应用,挺不错的,学习了

0x06 Reference

1. https://github.com/bit4woo/python_sec

2. Python Pickle反序列化带来的安全问题  http://www.vuln.cn/8094

3.python 正向连接后门 https://www.leavesongs.com/PYTHON/python-shell-backdoor.html

BUUCTF中的Pickle反序列化漏洞是指在该比赛的题目中存在通过反序列化攻击来执行任意代码的漏洞。具体来说,这个漏洞利用了Python中的pickle模块,pickle模块可以将对象序列化为字符串并保存到文件或通过网络传输。然后可以将这个字符串反序列化为原来的对象。这个过程中,如果不对反序列化的输入进行充分验证和过滤,攻击者可以构造恶意的pickle字符串,从而在反序列化的过程中执行任意代码。 在BUUCTF中,有一个题目叫做"Pickle Store",该题目利用了pickle模块的反序列化功能,并在反序列化的过程中执行了恶意代码。具体的攻击方法是,通过抓包获取到一个包含pickle字符串的session值,然后对这个字符串进行base64解码,并使用pickle模块的loads函数进行反序列化操作。这样就可以触发恶意代码的执行。 为了说明这个例子,作者提供了一个脚本来解析这个pickle字符串,首先使用base64解码得到原始字符串,然后使用pickle模块的loads函数进行反序列化操作,并最终执行恶意代码。这个例子展示了如何利用pickle模块的反序列化功能来执行任意代码。 在pickle模块中,还有一些其他的相关函数和方法可以帮助我们理解和分析pickle字符串的结构和内容。例如,pickletools模块提供了dis函数来反汇编pickle字符串,以及optimize函数来优化和简化pickle字符串的内容。 总结来说,BUUCTF中的Pickle反序列化漏洞是利用了pickle模块的反序列化功能来执行任意代码的漏洞。攻击者通过构造恶意的pickle字符串,可以在反序列化的过程中执行任意代码。为了解析和分析pickle字符串,可以使用pickle模块提供的函数和方法,如loads、pickletools.dis和pickletools.optimize。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值