CSRF (Cross Site Request Forgery)
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
Cross-Site Request Forgery (CSRF) Explained
Cross-Site Request Forgery (CSRF) - це тип вразливості безпеки, що зустрічається у веб-додатках. Він дозволяє зловмисникам виконувати дії від імені нічого не підозрюючих користувачів, експлуатуючи їх автентифіковані сесії. Атака виконується, коли користувач, який увійшов до платформи жертви, відвідує шкідливий сайт. Цей сайт потім викликає запити до облікового запису жертви через методи, такі як виконання JavaScript, надсилання форм або отримання зображень.
Prerequisites for a CSRF Attack
Щоб експлуатувати вразливість CSRF, потрібно виконати кілька умов:
Визначити цінну дію: Зловмисник повинен знайти дію, яку варто експлуатувати, наприклад, зміну пароля користувача, електронної пошти або підвищення привілеїв.
Управління сесією: Сесія користувача повинна управлятися виключно через куки або заголовок HTTP Basic Authentication, оскільки інші заголовки не можуть бути змінені для цієї мети.
Відсутність непередбачуваних параметрів: Запит не повинен містити непередбачуваних параметрів, оскільки вони можуть завадити атаці.
Quick Check
Ви можете захопити запит у Burp і перевірити захисти CSRF, а для тестування з браузера ви можете натиснути Copy as fetch і перевірити запит:
Defending Against CSRF
Для захисту від атак CSRF можна реалізувати кілька контрзаходів:
SameSite cookies: Цей атрибут запобігає браузеру від надсилання куків разом із запитами з інших сайтів. Більше про куки SameSite.
Cross-origin resource sharing: Політика CORS сайту жертви може вплинути на здійсненність атаки, особливо якщо атака вимагає читання відповіді з сайту жертви. Дізнайтеся про обхід CORS.
Перевірка користувача: Запит на введення пароля користувача або розв'язання капчі може підтвердити наміри користувача.
Перевірка заголовків Referrer або Origin: Валідація цих заголовків може допомогти забезпечити, що запити надходять з надійних джерел. Однак, ретельне формування URL може обійти погано реалізовані перевірки, такі як:
Використання
http://mal.net?orig=http://example.com
(URL закінчується на надійний URL)Використання
http://example.com.mal.net
(URL починається з надійного URL)Зміна імен параметрів: Зміна імен параметрів у POST або GET запитах може допомогти запобігти автоматизованим атакам.
CSRF Tokens: Включення унікального токена CSRF у кожну сесію та вимога цього токена в подальших запитах може значно зменшити ризик CSRF. Ефективність токена можна підвищити, впроваджуючи CORS.
Розуміння та реалізація цих захистів є критично важливими для підтримки безпеки та цілісності веб-додатків.
Defences Bypass
From POST to GET
Можливо, форма, яку ви хочете зловживати, підготовлена для надсилання POST запиту з токеном CSRF, але ви повинні перевірити, чи GET також дійсний і чи, коли ви надсилаєте GET запит, токен CSRF все ще перевіряється.
Lack of token
Додатки можуть реалізувати механізм для перевірки токенів, коли вони присутні. Однак вразливість виникає, якщо перевірка пропускається зовсім, коли токен відсутній. Зловмисники можуть експлуатувати це, видаляючи параметр, що несе токен, а не лише його значення. Це дозволяє їм обійти процес перевірки та ефективно провести атаку Cross-Site Request Forgery (CSRF).
CSRF token is not tied to the user session
Додатки, які не прив'язують токени CSRF до сесій користувачів, представляють значний ризик безпеки. Ці системи перевіряють токени проти глобального пулу, а не забезпечують, щоб кожен токен був прив'язаний до ініціюючої сесії.
Ось як зловмисники експлуатують це:
Аутентифікуються за допомогою свого облікового запису.
Отримують дійсний токен CSRF з глобального пулу.
Використовують цей токен в атаці CSRF проти жертви.
Ця вразливість дозволяє зловмисникам робити несанкціоновані запити від імені жертви, експлуатуючи недостатній механізм перевірки токенів додатка.
Method bypass
Якщо запит використовує "незвичний" метод, перевірте, чи працює функціональність перезапису методу. Наприклад, якщо він використовує метод PUT, ви можете спробувати використати метод POST і надіслати: https://example.com/my/dear/api/val/num?_method=PUT
Це також може спрацювати, якщо надіслати параметр _method всередині POST запиту або використовуючи заголовки:
X-HTTP-Method
X-HTTP-Method-Override
X-Method-Override
Custom header token bypass
Якщо запит додає кастомний заголовок з токеном до запиту як метод захисту CSRF, тоді:
Перевірте запит без кастомізованого токена та заголовка.
Перевірте запит з точною такою ж довжиною, але іншим токеном.
CSRF token is verified by a cookie
Додатки можуть реалізувати захист CSRF, дублюючи токен як у куки, так і в параметрі запиту або встановлюючи куки CSRF і перевіряючи, чи відповідає токен, надісланий на бекенді, значенню в куки. Додаток перевіряє запити, перевіряючи, чи токен у параметрі запиту відповідає значенню в куки.
Однак цей метод вразливий до атак CSRF, якщо веб-сайт має недоліки, які дозволяють зловмиснику встановити куки CSRF у браузері жертви, такі як вразливість CRLF. Зловмисник може експлуатувати це, завантажуючи оманливе зображення, яке встановлює куки, а потім ініціюючи атаку CSRF.
Нижче наведено приклад того, як може бути структурована атака:
Зверніть увагу, що якщо csrf токен пов'язаний з сесійним кукі, ця атака не спрацює, оскільки вам потрібно буде встановити жертві вашу сесію, і, отже, ви будете атакувати себе.
Зміна Content-Type
Згідно з цим, щоб уникнути попередніх запитів, використовуючи метод POST, дозволені значення Content-Type:
application/x-www-form-urlencoded
multipart/form-data
text/plain
Однак зверніть увагу, що логіка серверів може варіюватися в залежності від використаного Content-Type, тому вам слід спробувати зазначені значення та інші, такі як application/json
,text/xml
, application/xml
.
Приклад (з тут) відправки JSON даних як text/plain:
Обхід попередніх запитів для JSON-даних
Коли ви намагаєтеся надіслати JSON-дані через POST-запит, використання Content-Type: application/json
в HTML-формі не є безпосередньо можливим. Аналогічно, використання XMLHttpRequest
для надсилання цього типу вмісту ініціює попередній запит. Проте існують стратегії, які можуть обійти це обмеження та перевірити, чи сервер обробляє JSON-дані незалежно від Content-Type:
Використовуйте альтернативні типи вмісту: Використовуйте
Content-Type: text/plain
абоContent-Type: application/x-www-form-urlencoded
, встановившиenctype="text/plain"
у формі. Цей підхід перевіряє, чи бекенд використовує дані незалежно від Content-Type.Змініть тип вмісту: Щоб уникнути попереднього запиту, забезпечуючи при цьому, щоб сервер розпізнавав вміст як JSON, ви можете надіслати дані з
Content-Type: text/plain; application/json
. Це не викликає попереднього запиту, але може бути правильно оброблено сервером, якщо він налаштований на прийомapplication/json
.Використання SWF Flash файлів: Менш поширений, але можливий метод полягає у використанні SWF flash файлу для обходу таких обмежень. Для детального розуміння цієї техніки зверніться до цього посту.
Обхід перевірки Referrer / Origin
Уникайте заголовка Referrer
Додатки можуть перевіряти заголовок 'Referer' лише тоді, коли він присутній. Щоб запобігти надсиланню цього заголовка браузером, можна використовувати наступний HTML мета-тег:
Це забезпечує відсутність заголовка 'Referer', що потенційно обминає перевірки валідації в деяких додатках.
Regexp обхід
URL Format BypassЩоб встановити доменне ім'я сервера в URL, який Referrer збирається надіслати всередині параметрів, ви можете зробити:
Метод HEAD обхід
Перша частина цього CTF звіту пояснює, що код Oak, маршрутизатор, налаштований на обробку запитів HEAD як запитів GET без тіла відповіді - поширений обхід, який не є унікальним для Oak. Замість конкретного обробника, який займається запитами HEAD, їх просто передають обробнику GET, але додаток просто видаляє тіло відповіді.
Отже, якщо запит GET обмежений, ви можете просто надіслати запит HEAD, який буде оброблений як запит GET.
Приклади експлуатації
Екстракція токена CSRF
Якщо токен CSRF використовується як захист, ви можете спробувати екстрактувати його, зловживаючи вразливістю XSS або вразливістю Dangling Markup.
GET за допомогою HTML тегів
Інші теги HTML5, які можна використовувати для автоматичної відправки GET-запиту: