Основы этичного веб-хакинга (перевод)

HTML инъекция

Описание 
Инъекции 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.



Отредактировано: 08.03.2019