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模块不能防止错误或恶意构造的数据.切勿取消从不受信任或未经身份验证的来源收到的数据.
然而,这不是你的情况 - 你接受输入,通过常规验证,然后腌制它.
那么根据文档
警告:该
pickle模块不能防止错误或恶意构造的数据.切勿取消从不受信任或未经身份验证的来源收到的数据.
如果数据结构存在于pickle算法将进入无法保证程序行为的状态,则意味着仅通过调用它就可以攻击此功能.
根据这个网站
import pickle
pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") # This will run: ls ~
Run Code Online (Sandbox Code Playgroud)
是执行任意代码所需的全部内容.为了安全起见,还有其他的例子以及酸洗的"改进".
| 归档时间: |
|
| 查看次数: |
7745 次 |
| 最近记录: |