#什么是pickle?
pickle是python的序列化工具,可以将python对象序列化为字节流,然后再反序列化为python对象。当然,其中的原理还是比较复杂的,具体可以看看这篇文章,写的还是非常详细滴~
这里主要记一下怎么利用这里存在的漏洞喵~
#pickle和__reduce__方法
python中类的__reduce__方法,在pickle反序列化的时候会被执行。它应当返回字符串或者一个元组,这里主要考虑返回元组的状况。
下例:
class PickleRCE(object):
def __reduce__(self):
import subprocess
return (subprocess.getoutput,(command,)) #也可以是(map,(subprocess.getoutput,command))
这里返回一个二元组,第一个元素是某个对象,而第二个参数也是一个元组,是我们希望传输给首个元素这个对象的参数。像这个例子,相当于是调用了subprocess.getoutput(command),即用子进程执行命令command。
这时我们将其序列化,在存在反序列化漏洞的站点上传这串序列化字符串,就能达到rce的效果。这就是比较经典的pickle反序列化漏洞的利用手法。