Описание
Инъекции Hypertext Markup Language (HTML), также иногда
называемые виртуальным дефейсом. Они являются типом ата-
ки, которая благодаря отсутствию надлежащей обработки поль-
зовательского ввода позволяет злоумышленнику встроить на
сайт собственный HTML-код. Другими словами, такая уяз-
вимость вызывается получением некорректного HTML, как
правило, через форму ввода, а затем рендер этого HTML на
странице. Это отдельный тип уязвимости, который следует
отличать от инъекции Javascript, VBscript и прочих.
Поскольку HTML является языком, используемым для опреде-
ления структуры веб-страницы, если злоумышленник может
внедрить HTML, он может полностью изменить то, что отоб-
ражает браузер. Иногда результатом этого может стать полное
изменение внешнего вида страницы или, в других случаях,
создание формы для обмана пользователей. Например, если
вы можете внедрить HTML, вы можете добавить тег “‘<form>‘
на страницы, прося пользователя заново ввести его логин и
пароль. Однако, при отправке такая форма передаст инфор-
мацию злоумышленнику.
Примеры
1. Комментарии на Coinbase
Сложность: Низкая
Url: coinbase.com/apps
Ссылка на отчет: https://hackerone.com/reports/104543¹
Дата отчета: 10 декабря 2015
Выплаченное вознаграждение: $200
Описание:
В этой уязвимости автор отчета обнаружил, что Coinbase на-
прямую декодирует закодированные в URI значения при рен-
дере страницы. Для тех, кто не знаком с этим (так, как был
не знаком я на момент написания этого текста), поясню: сим-
волы в URI являются зарезервированными или незарезерви-
рованными. В Wikipedia написано, что зарезервированными
являются символы, которые в некоторых случаях имеют спе-
циальное значение, вроде / или &. Незарезервированные - все,
не имеющие специального значения, обычно это буквы.
Таким образом, когда символ закодирован в URI, он конвер-
тируется в свое байтовое значение в соответствии с ASCII
и получает префикс в виде знака процента (%). Это значит,
что / станет %2F, & превратится в %26. Кроме того, ASCII
была наиболее распространенной кодировкой в интернете до
появления UTF-8, еще одного типа кодировок.
Теперь, вернемся к нашему примеру, если хакер введет HTML
таким образом:
1 <h1>This is a test</h1>
Coinbase отрендерил бы его как обычный текст, в точности
как вы видите выше. Однако, если бы пользователь отправил
закодированные символы ASCII:%3C%68%31%3E%54%68%69%73%20%69%73%20%61%20%74%65%73%74%\
2 3C%2F%68%31%3E
Coinbase декодировал бы эту строку отрендерил соответству-
ющие символы:
This is a test
Таким образом, исследователь продемонстрировал, как он мо-
жет отправить HTML-форму с полями для имени пользователя
и пароля, которые были бы отрендерены Coinbase. Если бы
исследователь был злоумышленником, форма могла бы быть
отрендерена на Coinbase и смогла бы отправлять вводимые
в неё значения на сайт злоумышленника для получения им
данных доступа (предполагаем, что люди заполнят и отправят
форму).
ВЫВОДЫ
когда вы тестируете сайт, проверьте, как он
обрабатывает разные типы ввода, включая
простой текст и закодированный текст.
Замечайте случаи, когда сайты принимают
URI-закодированные значения, такие, как %2F
и рендерят их декодированные значения, в
этом случае /. Хотя мы не знаем, о чем думал
хакер в этом примере, возможно, он попробовал
закодировать в URI запрещенные символы и
заметил, что Coinbase их декодирует. Затем он
просто пошел немного дальше и закодировал в
URI все символы.
Отличный кодер/декодер HTML-символов:
http://quick-encoder.com/url². Пользуясь им,
вы заметите, что он будет вам сообщать
о незапрещенных символах, которые не
нуждаются в кодировании, и позволит вам,
кодировать ли такие символы или нет. Так вы
сможете получить такую же закодированную
строку, как та, что была использована на
Coinbase.