XSS-уразливість ВКонтакте

Нещодавно я вирішив підготувати чергову презентацію, присвячену web-уязвимостям, зокрема, XSS-атак. Для цього мені потрібно було вивчити деякі особливості сучасних систем фільтрації.

В якості цільового сайту для тестування я вибрав найбільш відвідуваний сайт Рунета - vkontakte.ru. Мою увагу привернула оновлена ​​система статусів.

Код HTML-сторінки в місці, де відбувається редагування статусу, виглядає наступним чином:

Код HTML-сторінки в місці, де відбувається редагування статусу, виглядає наступним чином:

Як видно, фільтр розташований безпосередньо в функції infoCheck ().
Сам же статус розташовується в цьому рядку:

Сам же статус розташовується в цьому рядку:

В даному випадку маємо двоступеневу фільтрацію. Перший ступінь - безпосередньо фільтрація у користувача при введенні статусу. Друга - перетворення введеного статусу в текст і повернення його на сторінку в тому вигляді, в якому статус побачать інші користувачі.

У той час як другий ступінь працює безумовно добре, і перетворити введене користувачем в активну XSS явно не вдалося б, з першою не все так гладко. Саме про першого ступеня і піде мова.

Як і передбачалося, простий <script> alert () </ script> не спрацював, статус залишився порожнім. Варіації на «околоscript-ні» теми теж не пройшли - судячи з усього, саме ця послідовність фільтрується явно.

Однак, для виконання скрипта зовсім не обов'язкова наявність тега <script>. Перша вразливість на користувальницької машині досягається використанням тега <img>: ввівши в статус рядок <img src = 1.gif onerror = some_function>, ми доб'ємося виконання цієї самої функції. Для наочності можна викликати функцію profile.infoSave (), що викликається з порожнім аргументом при очищенні статусу, з нашим аргументом. Так, ввівши <img src = 1.gif onerror = profile.infoSave ( 'XSS')>, отримуємо в статусі рядок "XSS":

Друга кумедна вразливість фільтра - в відсутності фільтрування тега <A>. Вводимо в статус <A HREF=»//www.google.com/»> XSS </A> і отримуємо ... гіперпосилання, при натисканні на яку відкривається вікно для редагування статусу, а миттю пізніше - сайт google.com!

Як ми пам'ятаємо, XSS = cross site scripting, тому в наступній уразливості я вирішив використовувати сторонній сайт з завантаженим туди скриптом. Крім відсутності фільтрації вищевказаних тегів, проходить фільтр і тег <iframe>. Таким чином, ввівши в статусну рядок <iframe src = "yoursite.com» width = »100%» height = »300">, отримуємо iframe з запуском того самого завантаженого скрипта. Приклад такого "айфрейма":

Приклад такого айфрейма:

Ця вразливість є більш серйозною, ніж дві попередні. Один із способів експлуатації - складання URL для зміни статусу користувача і наступний клік користувача за цим URL жертвою. Ще до того, як статус буде опублікований, скрипт встигне виконатися на сторінці користувача. Таким чином, отримуємо класичну пасивну XSS.

Уразливості були актуальні з 01.08.2010 - з моменту введення нової системи статусів. 01.03.2011 ми повідомили адміністрації мережі ВКонтакте про виявлені вразливості, і 03.03.2011 уразливості були закриті.

Дополнительная информация

rss
Карта