攻击Python的泡菜

Mat*_*tty 32 python security pickle

我正在编写一个将用户输入存储在对象中的Web应用程序.这个对象将被腌制.

用户是否有可能制作恶意输入,当对象被打开时,这些输入可以做一些令人震惊的事情?

这是一个非常基本的代码示例,它忽略了封装等精彩原则,但却集中体现了我所看到的:

import pickle

class X(object):
    some_attribute = None

x = X()
x.some_attribute = 'insert some user input that could possibly be bad'

p = pickle.dumps(x)

# Can bad things happen here if the object, before being picked, contained
# potentially bad data in some_attribute?
x = pickle.loads(p)
Run Code Online (Sandbox Code Playgroud)

Not*_*fer 15

是的,不是......

否 - 除非解释器或pickle模块存在错误,否则您无法通过pickle文本或类似的东西运行任意代码.除非eval稍后修改了pickle文本,否则你正在做一些事情,比如用这个数据中提到的类型创建一个新对象.

是 - 根据您计划稍后对象中的信息,用户可以执行各种操作.从SQL注入尝试到更改凭据,强制密码破解或在验证用户输入时应考虑的任何事项.但你可能正在检查这一切.


编辑:

python文档说明了这一点:

警告pickle模块不能防止错误或恶意构造的数据.切勿取消从不受信任或未经身份验证的来源收到的数据.

然而,这不是你的情况 - 你接受输入,通过常规验证,然后腌制它.

  • 这是一个例子,但是你必须在任何情况下保护你的代码免受用户输入的影响,所以我几乎不认为这是一个真正的威胁,除非你实际上让用户向你发送一个腌制对象http://www.securityfocus.com /买入/ 5257 /开发 (4认同)

Woo*_*Moo 7

那么根据文档

警告:该pickle模块不能防止错误或恶意构造的数据.切勿取消从不受信任或未经身份验证的来源收到的数据.

如果数据结构存在于pickle算法将进入无法保证程序行为的状态,则意味着仅通过调用它就可以攻击此功能.

根据这个网站

import pickle
pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") # This will run: ls ~
Run Code Online (Sandbox Code Playgroud)

是执行任意代码所需的全部内容.为了安全起见,还有其他的例子以及酸洗的"改进".

  • @ Woot4Moo然而,你确实声称"你会腌制它就好了,然后将它作为那个字符串取消.这会导致你执行我的陈述." 这不是真的.虽然你在答案中所说的都不正确,但我不确定它是否解决了这个问题,你不是在处理一个不受信任的泡菜,而是一些不受信任的数据.也就是说,我们可以构造一个字符串`s`,它会在`pickle.loads(pickle.dumps(s))中引起问题吗? (3认同)