Відкриття файлів і зовнішні дані. Потенційна уразливість php-скриптів
Функції fopen, file, include і require можуть відкривати файли з інших сайтів по протоколам http і ftp. Ця можливість несе в собі потенційну вразливість в php-скрипти, що дозволяє використовувати сайт як проксі.
У російськомовному інтернеті ця вразливість практично не була освітлена. На російськомовних сайтах з проблем безпеки мені не вдалося знайти безпосереднього повідомлення про цю уразливість.
Url fopen wrapper
CR / LF в HTTP-запити
Комбінація символів carriage return і line feed в HTTP-запиті розділяє заголовки. Детально про це можна почитати в статті Антона Калмикова «Генерація HTTP-запитів». Цю комбінацію символів можна передати в GET-запиті у вигляді "% 0D% 0A".
На багатьох сайтах сторінки генеруються скриптом-шаблонізатором. У скрипт перенаправляються всі запити сайту. З REQUEST_URI береться ім'я файлу, який треба відкрити. Файл зчитується, до нього додається шаблон з навігацією, шапкою і т.п. і результат видається клієнту.
Теж недбалий або недосвідчений програміст запросто може написати відкриття файлу без перевірки даних:
то скрипт виконає HTTP-запит:
Останні три рядки скрипт додає автоматично, але два \ r \ n перед ними означають кінець запиту. Таким чином, незахищений скрипт можна використовувати як проксі-сервер. Знаючи кілька "дірявих" сайтів, зловмисник може вибудувати з них ланцюжок, щоб його було складніше знайти.
Розумне використання експлойта
(Повинно бути одним рядком) модуль PHP з'єднається з сервером mail.example.com по 25 порту і відправить наступний запит:
Заходи захисту від експлойта
Вам, як розробнику або власнику сайту, важливо зробити все можливе, щоб через ваш сайт ніхто не зміг розіслати спам. Якщо це вийде, розісланий він буде з будь-якого гавайського діалапу, власники якого не розуміють людської мови, а крайнім можуть зробити саме вас.
Перевірка журналу запитів
Найпростіший спосіб відключити можливий вразливість - заборонити відкривати URL через файлові функції. Якщо ви адміністратор свого сервера - забороняйте allow_url_fopen в налаштуваннях php. Якщо ви просто клієнт - забороніть у себе локально. У файлі .htaccess для кореня сайту напишіть рядок: php_value allow_url_fopen 0 Якщо ви злий хостинг-провайдер, можете заборонити URL fopen wrapper для всіх клієнтів за допомогою директиви php_admin_value. Включення безпечного режиму (safe mode) в даному випадку не допоможе, операція продовжують працювати справно.
Припинення роботи при оффенсівном запиті
Клієнт, скануючий ваш сайт на предмет непроверяемих змінних, створює зайвий трафік і завантажує процесор сервера. Зрозуміло, що йому не потрібні сторінки, які генерує ваш сайт, якщо вони не працюють як проксі. Бажано вбивати такі запити ще до запуску php-інтерпретатора. Це можна зробити за допомогою модуля mod_rewrite. У файлі .htaccess в корені сайту я поставив такий рядок:
При цьому передбачається, що на сайті не будуть відправлятися методом GET форми з багаторядковим призначеним для користувача введенням. Інакше вони будуть зупинені цим правилом.