Хакеру достаточно немного изменить адресную строку, и получить доступ к любому файлу на сервере, например к файлу из базы данных:
http://127.0.0.1/test/sto.php?page=../../../mysql/data/db_baze_name/users.MYI%00
Расшифруем параметр $_GET['page']:
Поднимаемся на три уровня вверх (кол-во поднятий вверх определяется экспериментальным образом). Далее заходим в папку mysql/data/имя_базы/имя_таблицы.MYI. Конечно, если мы не знаем параметров сервера, то можем и не знать папок и файлов, находящихся на сервере. Но версия и операционная система сервера — это открытая информация, её можно узнать даже по телефону, позвонив в службу технической поддержки. После чего установить в качестве виртуальной машины нужную операционную систему, потом скачать и установить сервер, с настройками, как на том сервере, который собираемся атаковать. Далее нам лишь останется экспериментальным путем определить как добраться до нужных файлов.
%00 в конце имени файла — это шестнадцатеричный код для передачи по протоколу HTTP нулевого байта. Этот символ означает конец строки. Здесь он нужен, чтобы отбросить расширение .php.
Нулевой байт срабатывает не всегда, но хакеры открыли множество способов замены нулевого байта.
Основное предназначение локального инклюда — просмотр локальных файлов. Но его также можно использовать для создания полноценного web-шелла (оболочки для выполнения любых команд на стороне сервера либо доступа к командной строке).
Известно, что команда include() может принимать файлы с любым расширением, и выполнять их как реальные php-скрипты. Т.е. если ресурс позволяет загружать изображения, или любые другие файлы, то нам ничто не мешает, под видом изображения (с расширением .gif, .jpg или любого другого разрешенного расширения), залить на сервер команды php. Если на стороне сервера идет проверка файлов не только на расширение, но и на заголовки (массив Headers), то мы можем открыть блокнотом любое изображение, и дописать к коду изображения php-команды.