The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project The BrandLinks Project

Атаки на JavaScript. Часть 1

Tartuga

Местный
Регистрация
19.12.2019
Сообщения
101
Реакции
22
JavaScript один из популярнейших языков, используемых в работе сайтов. Благодаря такой популярности, можно найти самые разные примеры применения JavaScript. Из них самыми бессмысленными являются:

  • контроль доступа с помощью JavaScript
  • защита части или всего контента с помощью JavaScript
  • верификация данных методами JavaScript без перепроверки на стороне сервера
Создавая сайт, нужно исходить из того, что любые данные, пришедшие со стороны пользователя, являются ненадёжными и JavaScript не может что-либо гарантировать.

Для демонстрации уязвимости JavaScript мы будем обходить защиту в Damn Vulnerable Web Application (DVWA).

1. Любая часть веб страницы и JavaScript может быть произвольно изменена пользователем
Итак, ставим в DVWA уровень безопасности low (делается во вкладке DVWA Security) и переходим на страницу «JavaScript Attacks» и видим там следующее:


В качестве задания нам нужно передать слово «success» через форму на сайте. Пробуем: вписываем «success» и отправляем. Получаем ошибку «Invalid token.»:


Открываем исходный код страницы. Между тегами <script></script> там следующее:


Я могу понять только следующие строки:

function generate_token() {
var phrase = document.getElementById("phrase").value;
document.getElementById("token").value = md5(rot13(phrase));
}

generate_token();

Также посмотрим на форму, через которое мы должны отправить слово «success»:

<form name="low_js" method="post">
<input type="hidden" name="token" value="" id="token" />
<label for="phrase">Phrase</label> <input type="text" name="phrase" value="ChangeMe" id="phrase" />
<input type="submit" id="send" name="send" value="Submit" />
</form><script>

В функции generate_token() в первой строке переменной phrase присваивается то значение, которое имеет поле с идентификатором (id) phrase в форме. Затем во второй строке рассматриваемой функции значение переменной phrase обрабатывается двумя функциями и их значение присваивается элементу token в форме.

За пределами функция имеется код вызова этой функции:


Данный вызов не привязан ни к какому событию (например, отправка формы) или условию. Это означает, что когда страница открыта в нашем браузере, функция generate_token() уже выполнена, то есть значение токена для строки «ChangeMe» уже вычислено и присвоено полю ввода с идентификатором token. По этой причине, когда мы меняем значение поля ввода phrase, оно не совпадает с токеном о чём мы и получаем сообщение.

Получается, единственный способ справится с заданием — это изменить значение поля phrase с «ChangeMe» на «success» до открытия в веб браузере. Как это можно сделать?

Это можно сделать в Burp Suite, который среди прочего может менять содержимое любой части (заголовки и тело запросов и ответов) HTTP на лету.


Но я покажу вам совсем «детский» способ, который я использовал с первых лет появления у меня компьютера, для этого способа вообще не нужны никакие инструменты.

Суть элементарна: сохраняем страницу себе на компьютер, открываем редактором (любым текстовым или для HTML кода), делаем нужные правки, открываем эту страницу в браузере и отправляем!

Сохраняем (имя я выбрал покороче, иначе из-за специальных символов могут быть проблемы):


Открываем файл *.html и находим форму:


Как вы можете увидеть — она изменилась, а именно присвоено значение полю token — видимо, это сделал браузер при сохранении:

<form name="low_js" method="post">
<input type="hidden" name="token" value="8b479aefbd90795395b3e7089ae0dc09" id="token">
<label for="phrase">Phrase</label> <input type="text" name="phrase" value="ChangeMe" id="phrase">
<input type="submit" id="send" name="send" value="Submit">
</form>

Итак, во-первых, меняем «ChangeMe» на «success».

Во-вторых, у этой формы отсутствует атрибут action. В атрибуте action прописывается страница, куда отправляются данные. Если атрибут отсутствует (это допускается), то данные отправляются на тот же самый адрес, по которому размещена страница с формой. Это работало нормально, когда у страницы был адрес . Но когда я открою мой сохранённый файл, в качестве адреса у него будет что-то вроде file:///home/mial/Загрузки/1.html и браузер попытается отправить данные из формы по адресу file:///home/mial/Загрузки/1.html, а нам нужно отправить на сервер. Поэтому мы добавляем к форме атрибут action и в качестве его значения укажем адрес, куда должны будут отправится данные (в нашем случае исходный адрес формы): action="http://localhost/dvwa/vulnerabilities/javascript/"

Иногда у страницы может быть уже установлен action, но адрес указан как относительный путь — в этом случае опять же отправка формы не будет работать как нам нужно. Для исправления просто укажите абсолютный путь до страницы на целевом сайте.

В-третьих, как я упомянул, при сохранении страницы браузер вписал значение token — уберём его (хотя, по логике, это необязательно, так как новое значение будет рассчитано и присвоено после открытия страницы).

Итак, у меня получилась следующая форма:

<form name="low_js" method="post" action="http://localhost/dvwa/vulnerabilities/javascript/">
<input type="hidden" name="token" value="" id="token">
<label for="phrase">Phrase</label> <input type="text" name="phrase" value="success" id="phrase">
<input type="submit" id="send" name="send" value="Submit">
</form>

Сохраняю её и открываю файл в браузере:


Нажимаю кнопку «Submit»:


Обратите внимание на адрес страницы — мы вновь на сервере. При этом мы получили сообщение «Well done!» - то есть задача выполнена. Таким простым способом мы обошли защиту JavaScript и нам даже не пришлось разбираться в сложных алгоритмах расчёта маркера — достаточно было сделать небольшое изменение в реперной точке.

2. Изменение переменных JavaScript во время отладки
В веб-браузере откройте Инструменты разработчика (клавиша F12), перейдите во вкладку «Sources», выберите нужный файл (в нашем случае это (index)) и найдите в коде строку, где мы хотим сделать прерывание:


Кликните на номер строки для установки точки прерывания:


Обратите внимание, что в этой строке мы можем установить до четырёх прерываний, поскольку выполняется четыре операции. Я ставлю точку прерывания в самую правую часть — на первое действие:


Значение токена уже установлено, поэтому перезагрузим страницу, чтобы все скрипты выполнились заново.

Видим, что выполнение замерло на точке прерывания:


Присмотримся к этой информации:


Поменяем в этом окне значение phrase и нажмём кнопку «Resume script execution» (можно нажать F8):


На странице будут выполнены оставшиеся скрипты. Можно убрать точку прерывания и даже закрыть Инструменты разработчика.

Что мы имеем? Значение токена рассчитано для строки «success», теперь нам достаточно вписать эту строку в поле формы:


И отправить на сервер:


Продолжение следует...
 
Верх