Останнім часом в мережі Інтернет можна знайти дуже багато посібників для «Початківців хакерів», в яких детально описуються всі основні методи злому сайтів. Думаєте, веб-розробники стали від цього розумнішими і зробили всі можливі методи для захисту? Я так не думаю.
У цій статті я хочу ще раз розповісти розробникам про те, як ламають сайти, а щоб вам не було нудно, я попутно буду ламати Хабр і докладно описувати, як я це робив. Ми розглянемо такі цікаві штучки, як «Активна XSS в профілі», «Нескінченна обнулення карми», «Публікація топіків із позначкою 'З пісочниці'», «CSRF через Flash і дірку в Internet Explorer 6» і багато іншого.
Всі уразливості вже виправлені. Ну або майже все.
Хотілося б тут, на самому початку, розповісти кілька дуже важливих на мій погляд речей.
По-перше, хто такі зломщики і що їм потрібно (давайте не будемо називати «зломщиків» словом «хакери», тому що це неправильно і хакери нікого не ламають). Не хочу нікого образити, але в більшості випадків це підлітки 15-17 років, головна мета яких не скільки отримати гроші, скільки просто зламати систему і отримати почуття нікого самозадоволення.
Часто розробник думає, що ламати його сайт нікому і в голову не прийде, оскільки там немає нічого цікавого. Але хакерам тільки що описаного типу це і не потрібно, тому вони легко знаходять вразливість і роблять дефейс (як правило, розміщення свого повідомлення замість головної сторінки, Чорний Володар вже робив так пару раз з Хабрахабр :-). Іноді ж вони навіть не можуть знайти і просту уразливість, тому використовують готові експлоїти (таких людей ще називають «Скрипт-кідді»). Таким чином, я вже можу дати вам кілька порад:
- Не лінуйтеся фільтрувати вхідні дані [про це піде мова далі]. навіть якщо ваш сайт «нікому не потрібен».
- Ставити найсвіжіші версії ПО іноді небезпечно, але і на старих сидіти не варто, тому що вас зможе зламати будь-яка людина, що вміє користуватися пошуком і завантажувати спеціальні програми «для злому сайтів».
Тепер давайте уявимо, що наш «персонаж» виріс і почав шукати роботу. Чим він буде швидше за все займатися? Правильно, зломом за гроші.
Такий тип вже не представляє особливої небезпеки для сайтів, де справді немає нічого цікавого. Працює ж він тепер, в основному, «на замовлення», часто в невеликих групах.
Загалом, поради ті ж, тільки тепер вам варто трохи витратитися на людину, яка за гроші перевірить ваш сайт на наявність вразливостей і повідомить вам результати.
До речі, подібні «Експерти» - це, як правило, все той же зломщик, який пішов на пенсію і тепер заробляє на життя цілком мирним способом.
XSS або «Міжсайтовий скриптинг»
Ключова помилка веб-розробника в даному випадку - недостатня фільтрація отриманих від користувачів даних.
Подивимося, чим нас може «порадувати» Хабр. Британські вчені встановили, що 95% зломщиків називають себе
Йдемо в налаштування профілю і вводимо цю фразу в поле «Справжнє ім'я». Тепер тиснемо «Зберегти» і оновлюємо сторінку. Знаходимо мишку і пробуємо їй повозити біля чомусь порожнього поля - з'явилося віконце? Вітаю, ми знайшли уразливість!
Подібні уразливості часто вилазять, коли система не фільтрує або фільтрує частково приходить від користувача інформацію. Якщо ви пишете на PHP, то в ньому є дуже хороша функція htmlspecialchars. яка дозволяє вирішити проблему майже повністю.
Сенс такої, що не потрібно давати користувачеві можливість використовувати всі теги, потрібно також ретельно перевіряти, чи не вставив він щось в дозволений тег і не вийшов він за межі поля, як в прикладі вище.
Знайти приклад пасивної XSS на Хабре мені не вдалося, тому опишу її суть на словах.
Найчастіше місце, де їх можна знайти - це пошук. Спробуйте «пошукати» у себе на сайті щось на кшталт
Перевіряємо іншу прийняту інформацію
Фільтрувати потрібно не тільки HTML-теги і лапки, але також і іншу одержану від користувача інформацію.Особенно важливо стежити за логікою і ніколи не вірити користувачеві! За прикладом далеко ходити не треба - заповітна мрія будь-якого троля на Хабре, «Нескінченно обнуляє карма», була цілком можна реалізувати до сьогоднішнього дня :-)
Якщо ви вже обнуляли карму і хочете зробити це ще раз, то потрібно за допомогою «засобів розробника» вашому браузері просто зробити видимої приховану форму і натиснути «Обнулити»!
Для прикладу я створив «віртуальчіка», злив йому карму, обнулив, знову злив, знову обнулив і так далі ...
Наведу ще дуже цікавий приклад. Коли публікуємо нову статтю або редагуємо стару, то заміна поля «topic_type» на «sandbox» дозволяє отримати плашку «З пісочниці».
Навіщо це вам потрібно? Ну не знаю, припустимо, такі топіки частіше плюсують ...
Такі уразливості дуже часто зустрічаються у початківців веб-розробників. Знайти таку на Хабре я не зміг, але один хабропользователь стверджував мені в личку, що вона є. Я повторив його експеримент, але нічого не вийшло - напевно, закрили.
Для захисту потрібно фільтрувати лапки та інші спецсимволи, які можуть порушити логіку вашого запиту. Також, коли у вас є число, обов'язково явно приводите його до числа.
Якщо Бубмбурум починав своє підкорення Хабра з супер-флешки, то я за ніч потрапив в ТОП5 користувачів завдяки знайденої мною в минулому році CSRF-уразливості.
Зараз же я пишу це тому, що недавно знайшов ще одну таку ж і вона могла запрошувати на Хабре моїх віртуальчіков за допомогою користувачів, які користувалися Internet Explorer 6. Варто зауважити, що таких виявилося небагато.
Для захисту вам потрібно вставляти в кожну форму або важливий запит особливий csrf-токен, який не повинен знати зловмисник. Деякі фреймворки вставляють цей токен в ваші форми автоматично.