Таски по пентесту: SQLi, XSS, SSTI и NoSQL — эфир CyberED
Повышение цен ▲
на все программы в 2026 году
Интенсивы Взлом Защита Безопасная разработка Основы
Мероприятия Календарь О нас Отзывы PRO-подписка Новости

Разбор и решение тасок по пентесту и сравнение с AI

Как решать веб-таски по пентесту от условия до флага: SQL-инъекция в регистрации, XSS через форму обратной связи, SSTI и NoSQL-инъекция в MongoDB. И где AI-агент находит уязвимость быстрее человека.

Тема:ПентестAI и агенты
Когда прошло 3 ноября1 ч 9 мин
Никита Коломиец
Никита Коломиец
Специалист по анализу защищённости

О чём эфир

Поймёшь, как читать условие веб-таски: в каждой из четырёх тасок уровня Easy оно прямо указывало на класс уязвимости, и с этого начинается решение.

Пройдёшь путь до флага в четырёх классах: SQL-инъекция в запросе регистрации, слепая и DOM XSS с кражей сессии администратора, SSTI с двойным декодированием ввода и NoSQL-инъекция в MongoDB с посимвольным перебором пароля.

Узнаешь, почему трюк с INSERT не сработает в приложении, где пароли хешируются через bcrypt с солью.

Увидишь, где AI-агент находит уязвимость быстрее человека, а где застревает, и почему для учебных тасок не нужна система с десятками скиллов.

Разбор эфира по темам

Как решать веб-таски по пентесту: подсказка почти всегда в условии

Веб-таска это маленькое веб-приложение с заложенной уязвимостью и флагом внутри. Чтобы его достать, нужно пройти тот же путь, что и на пентесте: посмотреть функционал, понять, где может быть уязвимый код, проверить гипотезу и довести её до результата. Главная подсказка обычно лежит в условии: в каждой из четырёх тасок ниже оно прямо указывало на класс уязвимости.

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

  • InsertIssue: SQL-инъекция в MySQL.
  • Contact: XSS, через которую уводят сессию администратора.
  • Temple: SSTI, инъекция в шаблонизатор.
  • Mango: NoSQL-инъекция в MongoDB.

Каждую таску решали дважды: руками в Burp и AI-агентом. Так видно, где человек застревает, где агент находит вектор быстрее и где оба упираются в одно и то же место.

InsertIssue: SQL-инъекцию проверяют во всех запросах, а не только во входе

InsertIssue: решение веб-таска на SQL-инъекцию

На старте только форма входа и регистрации.

Если вы видите форму авторизации, то чаще всего это SQL-инъекция либо NoSQL-инъекция.

Никита Коломиец

Пара admin / admin не подходит, зато попытка зарегистрироваться с логином admin сообщает, что такой пользователь уже есть. Это отдельная находка, перечисление пользователей: её обычно оценивают как low или medium.

Дальше запросы уходят в Burp Repeater, и каждый проверяется отдельно. Кавычка в логине при входе ничего не меняет: приложение ведёт себя как обычно. А кавычка в запросе регистрации сразу даёт ошибку синтаксиса MySQL. Две кавычки подряд, и регистрация снова проходит. Значит, инъекция именно здесь.

Важно понять, какой запрос перед тобой. Вход выполняет SELECT: ищет в базе пользователя с совпадающими логином и паролем. Регистрация выполняет INSERT: добавляет нового пользователя в таблицу. Текст ошибки показывает колонки, и в конце после пароля идёт логическое значение. Разумная гипотеза: это признак администратора.

Остаётся закрыть запрос своими значениями. Комментарий через два дефиса не срабатывает, через решётку срабатывает. Регистрируем пользователя, сами ставим третьей колонке true, входим и получаем флаг.

Почему в современном приложении такой трюк уже не сработает

Таска хороша, чтобы отработать саму инъекцию, но с современными приложениями у неё мало общего.

Сейчас каждый разработчик хеширует пароль, использует какой-нибудь bcrypt, и пароль в чистом виде вы просто не увидите.

Никита Коломиец

Если добавить через INSERT пользователя с паролем admin, приложение сочтёт эту строку хешем, и войти не получится: пришлось бы подбирать пароль, у которого такой хеш.

Подставить хеш своего пароля тоже не выйдет. Хеш считается с солью, а соль хранится в самом приложении. Без неё валидное значение для базы данных не посчитать.

Ту же таску можно решить и по-другому: sqlmap или перебором в Intruder вытащить пароль администратора посимвольно. Но добавить администратора самому быстрее.

Contact: если администратор читает обратную связь, проверяй слепую XSS

Contact: решение веб-таска на XSS

В условии сказано, что администратор сайта ответственный и часто проверяет, что пишут в форму обратной связи.

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

Никита Коломиец

Значит, в форму можно отправить слепую XSS, которая выполнится у администратора и пришлёт его куки на твой сервер, например на Burp Collaborator.

Перед атакой стоит посмотреть на саму куку сессии. Флага HttpOnly на ней нет, значит, скрипт на странице может её прочитать. Если у администратора та же настройка, его session ID можно увести, подставить себе и открыть флаг.

Нагрузка из шпаргалки по XSS в поле сообщения долго не отрабатывала: на Collaborator приходили обрывки строки, а куки не было. Значит, гипотеза про это поле неверна, и искать надо в другом месте.

Когда нагрузка не срабатывает, ответ лежит в исходном коде страницы

Разгадка оказалась в другом месте. На странице есть скрытое поле lang, и его значение из GET-параметра без обработки подставляется в разметку ссылки. Это DOM XSS: выходим из атрибута, дописываем свой скрипт, и он срабатывает у любого, кто откроет страницу с таким параметром.

Дальше всё просто. Собираешь ссылку с нагрузкой в параметре lang и отправляешь её администратору через форму. Он открывает ссылку, скрипт уходит на Collaborator вместе с сессией, ты подставляешь её себе и забираешь флаг. Вывод для любой таски с исходниками: прежде чем менять нагрузку, найди в коде, куда именно попадает твой ввод.

Здесь AI-агент оказался быстрее человека: он сразу нашёл скрытое поле lang, на которое при ручном решении вышли не с первой попытки.

Temple: SSTI начинается с поиска места, где рендерится шаблон

Temple: решение веб-таска на SSTI

Условие говорит, что флаг лежит где-то в файле, а цель «весьма шаблонная»: получить RCE. Слово «шаблонная» намекает на шаблоны, то есть на SSTI, когда пользовательский ввод попадает в шаблон и выполняется на сервере. К таске приложены исходники, поэтому первым делом ищем в них место, где рендерится шаблон.

В коде видно, что у входной строки есть режим кодирования: если он включён, строка сначала декодируется и сразу вставляется в шаблон. Отсюда приём: передать нагрузку закодированной, тогда она раскодируется и попадёт в шаблон как есть. Проверка простым выражением возвращает 49, значит, шаблонизатор выполняет то, что ты прислал.

Дальше нужен путь до выполнения команды, и здесь таска перестаёт быть простой. Универсальные нагрузки отдают ошибку 500. Приходится выводить список доступных классов и искать среди них тот, что даст доступ к системным функциям. Рабочий вариант подсказали из чата. В итоговом решении путь к файлу с флагом передаётся параметром запроса, команда выполняется и выводит флаг.

AI-агент на этой таске застрял дольше всего: к концу разбора он всё ещё с ней разбирался.

Mango: NoSQL-инъекция пускает без пароля, а сам пароль достают перебором

Mango: решение веб-таска на NoSQL-инъекцию в MongoDB

Название подсказывает MongoDB, а значит, NoSQL-инъекцию. AI-агент тоже сразу это понял и начал проверять NoSQL-инъекции. К таске приложены исходники, и в них, по сути, уже видно решение.

В POST-запросе на /login логин и пароль никак не валидируются. Если вместо пароля передать оператор $ne с пустой строкой, то есть «пароль не равен пустой строке», условие выполняется для любого пользователя. Так можно войти под администратором, не зная пароля.

Но цель таски в том, чтобы достать сам пароль администратора, а вывести его напрямую нельзя. Поэтому его подбирают посимвольно через оператор regex: запрос проверяет, с каких символов начинается пароль. Если вход проходит, символ угадан, и можно переходить к следующему. Начало флага известно заранее, это сокращает перебор.

Где AI-агент помогает, а где нет

Когда таску Contact отдали агенту, ставка была такой.

Интересно, догадается ли агент. Если догадается, то всё, пентестеры умерли.

Никита Коломиец

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

  • InsertIssue: агенту не понадобилось даже описание задачи, он сам понял, что перед ним SQL-инъекция, и пошёл её искать.
  • Contact: агент сразу нашёл скрытое поле lang, на котором застрял человек.
  • Temple: многошаговая SSTI с подбором пути до команды оказалась для агента самой трудной.
  • Mango: агент сразу распознал NoSQL-инъекцию.

Для учебных тасок хватает агента с настройками по умолчанию. Большая система для пентеста с десятками скиллов полезна на большом веб-приложении, а в таске с одной формой она только загружает в контекст лишнее и тратит токены.

Как подходить к веб-таске: короткий порядок

  1. 1

    Прочитай условие: в каждой из четырёх тасок оно называло класс уязвимости. Форма входа, администратор у формы обратной связи, «шаблонная цель», название Mango.

  2. 2

    Отправь все запросы приложения в Repeater и проверь каждый: в InsertIssue уязвима регистрация, а не вход.

  3. 3

    Если к таске приложены исходники, читай их раньше, чем перебираешь нагрузки: в Contact и Temple ответ был в коде.

  4. 4

    Нагрузка не сработала: пересмотри гипотезу и ищи, куда ещё попадает твой ввод.

  5. 5

    Дай ту же таску агенту и сравни его путь со своим: так быстрее видно, что ты пропустил.

Таски разворачиваются на Портале отдельно под каждого участника, в своём контейнере, поэтому решать их можно изолированно, никому не мешая.

Частые вопросы

Можно ли решить таску на SQL-инъекцию через sqlmap?

Да, таска решается и через sqlmap, и перебором в Intruder: так можно по символам вытащить пароль администратора. Но проще воспользоваться тем, что уязвим запрос INSERT при регистрации, и самому добавить пользователя с правами администратора.

Почему нельзя подставить в инъекцию хеш своего пароля?

В современных приложениях пароль хешируется с солью, а соль хранится в самом приложении. Не зная её, валидный хеш для базы данных не посчитать, поэтому войти под добавленным так пользователем не получится.

Нужен ли особый конфиг AI-агента для решения тасок?

Для простых тасок хватает агента с настройками по умолчанию: он сам догадывается, что перед ним SQL-инъекция, и начинает её искать. Система с десятками скиллов для пентеста здесь только тратит токены.

Можно ли в таске Mango достать пароль администратора без перебора?

Нет. Вывести пароль напрямую нельзя: его подбирают посимвольно, через regex в запросе логина проверяя, с каких символов он начинается.

Где взять стенд с таской?

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

Ещё эфиры по теме