Безпечний код: Підробка міжсайтових запитів (CSRF)
Приводом до написання цієї статті стало знаходження мною уразливості в одному досить відомому модулі. Так як за правилами виявлення вразливостей. я поки не має права розповідати про деталях, то розповім про уразливість в загальних рисах, а також про методи боротьби з нею.
Отже, підробка міжсайтових запитів (анг. Сross Site Request Forgery, або, скорочено, CSRF): що це таке і з чим його їдять.
Одне із застосувань СSRF - експлуатація пасивних XSS, виявлених на іншому сервері. Так само можливі відправка спаму від імені жертви і зміна будь-яких налаштувань облікових записів на інших сайтах (наприклад, секретного питання для відновлення пароля).
живий приклад
Наприклад, нам потрібно зробити невеликий модуль, який повинен Аяксом видаляти Ноди. Це можна реалізувати службової посиланням Ноди, при натисканні якої, відправляється аякс запит на друпаловскій шлях. До цього шляху причеплений обробник, який і видаляє ноду. Ось приблизно таким модулем все і робиться:
node_destroy.module
node_destroy.js
І тут, в пориві деструктивного креативу, він створює ноду з таким контетом:
Що відбувається в цей момент? Ніяка картинка, природно, не підвантажиться, але браузер троля виконає запит на цей шлях з колишнім результатом.
Змирившись з невдачею, троль йде з сайту. Через день, адміністратор сайту зауважує цю сміттєву ноду, заходить в неї і видаляє. А повернувшись до списку матеріалів, не знаходить в ньому Ноди з айдішніком 123. Атака вдалася. Завіса.
Для тих, хто не зрозумів, коли адміністратор зайшов в ноду, його браузер теж ломанулся за посиланням картинки. Але тут вже прав доступу вистачило, і нода була успішно видалена, а адмін навіть нічого не помітив.
Як уникнути CSRF вразливостей?
Відповідь - використовувати унікальні посилання для дій зі зміни даних. Як це можливо? У друпалі використовується метод токенізаціі посилань. Це означає, що до заслання активної дії, додається унікальний параметр, який перевіряється при здійсненні самої дії. У друпалі згенерувати такий параметр можна функцією drupal_get_token (). Перевірити -drupal_valid_token (). Токен генерується на основі подається значення, сесії користувача, а також приватного ключа сайту, що практично зводить на нуль ймовірність генерації шкідником правильного токена.
Внесемо зміни в наш модуль. Почнемо з виставлення правильної посилання: