Атакуем через HTML тег а
Тег a — это не только ценный мех, но и инициализация window.opener. В этой статье вас ждет рассказ об одной особенности данного тега и способы решения проблемы.
Часть 1
От теории к делу!
Предположим, что мы имеем страницу, в которую можем встроить гиперссылку. Напишем код, позволяющий воспроизвести нам данную уязвимость.
//Код №1 /*Автор кода просит прощения за все баги, связанные с ним. Код написан под node.js */ var http = require('http'); http.createServer(function (rq, rs) { var cookie="Super :"+Math.random(-1)*30/13+": Mario"; //при каждом новом запросе, значение куки будет разным rs.writeHead(200, {'Content-Type': 'text/html', 'Set-Cookie': cookie}); if(!require('url').parse(rq.url).query){ // проверим на наличие входных данных rs.end('<h2>ERROR!</h2><br>Example: http://127.0.0.1:8080/wo.bug?host=http://google.com/<br>Shutting down :)'); console.log('[DEBUG] URL: '+rq.url+' is not valid!'); // немножко дебага console.log('Achtung!'); process.kill(process.pid); //чтобы наверняка :) } var host=require('url').parse(rq.url, true).query.host, //парсим host=host.replace(/ /g,'%20'),//Решим проблему с обрезанием пробела host=host.replace(/</g,'&'+'lt;'), //antiXSS host=host.replace(/>/g,'&'+'gt;'), //antiXSS host=host.replace(/javascript:/g,''); //antiXSS console.log('URL: '+host); //Вывод ссылки в консоль rs.end('<center><br><a href='+host+' target="_blank">click-click</a><br>Hey, '+cookie+'! </center>'); //"безопасный" вывод}).listen(8080); //запустим сервер на 8080 порту
В данном коде специально пропущена фильтрация протокола data. Через специально сформированную ссылку, и по средствам w.o, мы сможем выполнить XSS атаку. Для тестов я взял «большую тройку» браузеров: Opera/12.12, FireFox/18.00, Chrome/23.0.1271.97.
FireFox
Итак, передадим в атрибут href, тега a, значение «data:,1»:
После нажатия на гиперссылку видим, что w.o инициализирован:
А это значит, что, возможно, мы имеем возможность получить полный доступ к родительскому окну. Остается только убедиться в этом.
Используя w.o, мы успешно получили доступ к кукам родительского окна, но вот почему document.cookie=window.opener.document.cookie я не знаю, честно. Замечу, что данная особенность характерна только для FF.
Проверил на VM с XP SP3 и FF 17, такая же картина:
Остается только написать exploit, который будет использовать тег «а», протокол data и w.o, для кражи кук(да и вообще чего угодно).
|