rusgram: патч RCE, захвата аккаунта, SSRF и падений в 500

Разбор сервиса и все PoC — в services/rusgram/WRITEUP.md и VULNS.md.
Каждая находка воспроизведена на живом стенде до патча и перепроверена после.

content.py — V1 (RCE, крит) и V5:
  template_folder='files' совпадает с каталогом БД, поэтому render_template(path)
  с путём из URL рендерил файл пользователя как исходник Jinja-шаблона. Имя юзера
  выбирает атакующий: регистрируем `pwn.html`, кладём payload себе в first_name,
  дёргаем /db/users/pwn.html через публичный :38000 — RCE от root в контейнере,
  где смонтирован весь website/. Теперь рендерим только 4 реальные страницы.

logic.py — V2 (захват аккаунта) и V3/V6 (SSRF/открытый редирект):
  register не проверял существование юзера, а database делал read-modify-write,
  так что повторная регистрация ПЕРЕЗАПИСЫВАЛА пароль, сохраняя msg и профиль:
  чужой аккаунт вместе с флагом и сломанный логин у чекера. Теперь 409.
  Location строился из заголовка Origin, а proxy ходил по нему серверсайд —
  чтение внутренней сети. Редирект стал фиксированным /login.html.

database.py — снижает ущерб от V4:
  валидация имени юзера как имени файла, белый список полей, пароль можно только
  создать, но не перезаписать (смены пароля в сервисе нет), 400/404 вместо 500.

proxy.py — defense in depth к V3: allow_redirects=False на ветке api/.

V8: единая безопасная проверка сессии вместо 4 копий — кривая кука, отсутствие
куки, несуществующий юзер и нечисловой img больше не роняют воркер в 500.

Формат куки login||password и плейнтекстовые пароли осознанно НЕ трогали:
чекер почти наверняка на них завязан.

Тесты: services/rusgram/test_rusgram.py — SLA 16/16, SEC 21/21 на патче;
на services_vulnerable та же секция SEC падает 12 раз. Сплойт собирает 0 флагов.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NN8sHQuGbTBLGGkJyfxzXr
This commit is contained in:
2026-08-26 11:31:28 +03:00
co-authored by Claude Opus 5
parent 8041f1b90f
commit 14b5855b86
9 changed files with 1169 additions and 86 deletions
+10 -1
View File
@@ -1,12 +1,15 @@
version: "3"
services:
proxy:
build: ./proxy
image: git.itqdev.xyz/4x10m/rusgram-proxy:${IMAGE_TAG:-latest}
restart: unless-stopped
ports:
- "38000:5000"
static:
build: ./static
image: git.itqdev.xyz/4x10m/rusgram-static:${IMAGE_TAG:-latest}
restart: unless-stopped
ports:
- "38001:5001"
volumes:
@@ -14,6 +17,8 @@ services:
database:
build: ./database
image: git.itqdev.xyz/4x10m/rusgram-database:${IMAGE_TAG:-latest}
restart: unless-stopped
ports:
- "38002:5002"
volumes:
@@ -21,11 +26,15 @@ services:
logic:
build: ./logic
image: git.itqdev.xyz/4x10m/rusgram-logic:${IMAGE_TAG:-latest}
restart: unless-stopped
ports:
- "38003:5003"
content:
build: ./content
image: git.itqdev.xyz/4x10m/rusgram-content:${IMAGE_TAG:-latest}
restart: unless-stopped
ports:
- "38004:5004"
volumes: