Обхід Safe Mode

Починаючий хакер дуже часто може злякати те, що на сервері включена опція Safe Mode в PHP. Наприклад, хакер зламав якийсь сайт через include(), require(), fopen() уразливість, але в виконання команд оболонки в нього недостатньо прав. Кожен із цим стикався, але не кожен вирішував цю проблему.

Методів обходу Safe Mode досить багато. Але спочатку розберемося в тому, що являє собою Safe Mode. Safe Mode – це директива в PHP, яка забороняє виконувати system(), passthru(), exec(), shell_exec та інші функції, що виконують системні програми. Якщо PHP налаштований, як Safe Mode + open_basedir, тоді ніякі файли поза open_basedir не обслуговуються PHP, не стартують програми, які знаходяться поза цією директорією.

Список функцій, що обмежуються Safe Mode: chgrp, include, require, chmod, link, rmdir, chown, passthru, sumlink, exec, popen, system, fopen, readfile, unlink, file, rename. Досить корисна функція для системних адміністраторів і досить шкідлива для хакерів, чи не так? Але все можна обійти, я в цьому переконався вже давно, чого і тобі бажаю. Safe Mode не блокує функції include(), require(), fopen(), fwrite() та багато інших, не менш корисних. Тоді ми просто реалізуємо все, що нам потрібно за допомогою інших функцій PHP, не вдаючись до запуску системних команд.

Для цього нам потрібен скрипт, через який ми будемо виконувати PHP код.

path). " \n"; while (False !== ($entry = $dir->read())) if (is_dir(realpath($dir->path).'/'.$entry)) echo «[«. $entry.»].(is_writable(realpath($dir->path).'/'.$entry) ? ' [W]' : »). " \n"; > else echo $entry.(is_writable(realpath($dir->path).’/’.$entry) ? ‘ [W]’ : »). " \n"; > > $dir->close(); ?>

Прекрасно! Ось ізнайшлася заміна "ls-la".

$ dir = dir («.»); — у дужках вказуй повний шлях до директорії, листинг якої хочеш побачити. Якщо не знаєш повного шляху на сервері, просто запусти код без параметрів і побачиш цей шлях.

file(»)))); - Наприклад замінюєш на file('/etc/passwd')))))";

Ось вона потужність PHP! І це ще не все, якщо на файл поставлено біт +w, то зможемо записати в нього будь-яку інформацію.

$filename - ім'я файлу $comecontent - те, що пишемо у файл

Якщо потрібно записати PHP інформацію використовуй $comecontent такого виду:

Далі я наведу ще трохи корисних загальнодоступних функцій PHP, які стануть вам у нагоді. Відразу кажу, що не всі працюватимуть у правильно налаштованому Safe Mode.

Відкриття файлу або URL: fopen($sPathFile, $sModifier); //модифікатор може мати значення: //\'r\' — Відкрити тільки для читання; //\'r+\' — Відкрити для читання та запису; //\'w\' — Відкрити тільки для запису; //\'a\' — Відкрити тільки для запису в кінець файлу; //\'a+\' — Відкрити для читання та запису в кінець файлу;

Перейменування файлу: rename($sOldPath, $sNewPath)

Видалення файлу: unlink($sPathFile);

Перевірка існування файлу: file_exists($sPathFile);

Перевірка підтримки читання: is_file($sPathFile);

Такий собі chmod в PHP (в Safe Mode часто вимкнено): chmod($sPathFile, 0755) // Обов'язково пишіть О (нуль) перед покажчиком режиму

Виведення вмісту файлу в браузер: readfile($sPathFile);

Створення директорії: mkdir($sPathFolder, $iChmod);

Видалення директорії: rmdir($sPathFolder);

До речі, іноді прокочує досить цікавий спосіб:

Це спосіб виконання системних команд, що не вимагає виклику функцій. Туткоманда полягає у зворотні апострофи.

Дійсно, з обходом Safe Mode з'являється дуже велика морока, часом легше завантажити, наприклад, perl сценарій, і виконувати команди через нього. PHP дає нам можливість завантажити будь-який файл, хоч із localhost хоч з віддаленого сервера.

З твого комп'ютера:

Також файл можна завантажити через ftp:

Ще один спосіб обходу Safe Mode полягає бібліотека mysql, через функції якої можна робити події з довільними файлами. Юзай оператор LOAD DATA і буде тобі щастя.

CREATE TABLE `test` (`file` LONGBLOB NOT NULL); завантаження файлу в таблицю LOAD DATA INFILE "/etc/passwd" INTO TABLE test; виведення вмісту файлу та видалення таблиці SELECT * FROM test; DROP TABLE test;

Також у п'ятому аргументі функції mail() було знайдено вразливість, яка дозволяє передавати опції командного рядка у sendmail:

sql.safe_mode = On safe_mode_gid = On safe_mode = On 🙂

Встановити safe_mode_include_dir та safe_mode_exec_dir.

disable_functions – тут необхідно заборонити функції, що не використовуються на сервері, phpinfo() та інші.

І не забудьте оновлювати програмне забезпечення на своєму сервері.

Якщо що, пиши, я завжди допоможу налаштувати сервер на певну плату 😉