Краулеры и симуляция броузера
Важным инструментом разведки web-приложений
являются web-краулеры. Пауки обходят все
страницы сервера и собирают все ссылки. Но
что происходит если HREF указывает на JavaScript,
осуществляющий Ajax вызов при помощи XHR
объекта? Краулер может пропустить важную
информацию.
Во многих случаях очень трудно
симулировать работу rkbtynf. В качестве
примера возьмем такие ссылки:
<a href="#" onclick="getMe(); return false;">go1</a><br>
<a href="/hi.html">go2</a><br>
<a href="#" onclick="getMe(); return false;">go3</a><br>
При клике на линке go1
выполнится функция getMe(). Код ее такой (обратите
внимание, что эта функциональность может
быть реализована в отдельном файле):
function getMe()
{
var http;
http = new XMLHttpRequest();
http.open("GET", "hi.html", true);
http.onreadystatechange = function()
{
if (http.readyState == 4) {
var response = http.responseText;
document.getElementById('result').innerHTML = response;
}
}
http.send(null);
}
Такой код делает простое Ajax обращение к hi.html
ресурсу на сервере.
Можно ли симулировать клик автоматически?
Да, можно. Вот один из примеров реализации
при помощи плагина Chickenfoot,
который предоставляет JavaScript-овый API
расширяющий программный интерфейс браузера.
Используя Chickenfoot можно написать простой
скрипт для автоматизации поведения
броузера. Применяя эту методологию можно
легко автоматизировать и web-краулеры.
Приведу в качестве примера простой скрипт,
который кликает все якори с событиями onClick.
Преимущество этого плагина в том, что он
реально обрабатывает события делая XHR Ajax
вызовы, которые пропускаются обычными
краулерами, не способными сымитировать
событие onClick.
l=find('link')
for(i=0;i<l.count;i++){
a = document.links[i];
test = a.onclick;
if(!(test== null)){
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click',true,true,document.defaultView,1,0,0,0,
0,false,false,false,false,0,null);
a.dispatchEvent(e);
}
}
Можно загрузить этот скрипт в консоль
Chickenfoot и запустить, как показано на рисунке:
Таким образом можно получить доступ к Ajax
приложениям из Firefox. Есть так же несколько API
вызовов, которые можно использовать в
Chickenfoot плагине. Один из них это fetch команда
для построения утилиты-паука.
Логика и ее анализ
Для анализа клиентских Ajax-приложений
необходимо рассмотреть каждое из событий
очень аккуратно, иначе мы потеряем логику
работы. Один из путей определения логики
работы это построчный разбор всего кода.
Часто, каждое из событий вызывает несколько
функций из одного файла. Следовательно, для
анализа нужно проследить за исполняемым в
броузере кодом.
Существует несколько мощных дебаггеров
для JavaScript-ов, которые могут помочь достичь
поставленной цели. Например это Firebug, другой
вариант - venkman. Мы для примера возьмем первый
вариант.
Рассмотрим простой пример логина.
Страница login.html принимает имя и пароль от
пользователя. Воспользуемся функцией inspect
плагина Firebug для определения свойств формы.
Очевидно, что вызов идет к функцией ayth.
Теперь можно перейти в дебаггер и
посмотреть ее смысл.
Тут можно посмотреть все JavaScript-ы и их
зависимости . Обращения идут к ajaxlib.js и
validation.js. В этих файлах описано несколько
функций и можно предположить, что процесс
аутентификации использует несколько из
них. Мы может использовать точки останова
для пошагового исполнения всего
приложения. Установив брейкпоинт мы можем
ввести информацию в форму, нажать кнопку
Submit и посмотреть что же произойдет. В нашем
примере мы поставили брейкпоинт в функции
auth:
Теперь можно заняться отладкой,
достаточно кликать на кнопку "step in".
Исполнение передается другой функции, userval,
находящейся в validation.js:
Видно, что используется регулярное
выражение для проверки введенного поля,
после чего управление передается другой
функции, callGetMethod:
В конце концов мы выходим на обращение к
бекэнд web-сервису при помощи XHR объекта:
Вот мы и определили конечный ресурс:
http://example.com/2/auth/ws/login.asmx/
getSecurityToken?username=amish&password=amish
Этот ресурс - некий web-сервис,
реализованный в
.NET framework. Разбор всего процесса выявил
интересную деталь: процесс идентификации
можно легко обойти. Это потенциальная
угроза безопасности приложения.
Проводя наше исследование дальше, мы
можем получить доступ к сервису используя
WSDL файл и прямой брутфорс сервиса. Кроме
того мы так же можем запустить несколько
инъекций - SQL или XPATH - при помощи wsChess.
В данном конкретном случае приложение
уязвимо для инъекции XPATH. Рассмотрение
такого нападения находится за рамками этой
статьи. В этой мы можем лишь определить
возможные направления атаки - XSS, обход
клиентской безопасности, выполнение
злонамеренного Ajax кода, манипуляция DOM и т.д.
Заключение
Service-oriented architecture (SOA), Ajax, Rich Internet Applications (RIA)
и web-сервисы критически важные компоненты
нового поколения web-приложений. Что бы идти
в ногу с этими технологиями и отвечать на
задачи, которые ставит обеспечение
безопасности, нам
необходимо использовать разные
методологии и инструменты. Один из них -
эффективное использование браузера. В этой
статье мы рассмотрели три приема доступа к
web 2.0 приложениям. Используя их можно
обнаружить, понять и изолировать
связанные с Ajax уязвимости. Общая техника,
описанная в этой статье - хорошее начало для
исследований web 2.0 приложений.