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