我们以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