✍️ Статья Атаки на JavaScript. Часть 1

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

Tartuga

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

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

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

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

wnXVVH961fo.jpg

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

6vWduaYbQEU.jpg

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

NbA4IA3tOQM.jpg

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

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 на лету.

VdzzENUt_QE.jpg

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

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

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

XhWrzPul4uI.jpg

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

QRBfHHj8k9Q.jpg

Как вы можете увидеть — она изменилась, а именно присвоено значение полю 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>

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

SdwQ2qxxQNA.jpg

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

oiww5wfAbjA.jpg

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

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

S-bc_pIb5Cc.jpg

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

5pt3378IW2A.jpg

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

n71wVOq_T2o.jpg

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

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

flcf836VRqs.jpg

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

_XLFmjkxcNU.jpg

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

EP2c3fkgtgc.jpg

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

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

Huw1zUD_Z38.jpg

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

RzvIusKhzHg.jpg

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

📌 Золотая реклама

AnonPaste

Верх