Command Injection
Дефекты приложения приводящие к возможности выполнения неавторизованного кода на сервере.
В зависимости от типа используемого ПО различают: SQL, командные, XEE, email инъекции. Каждая из них может привести к максимально плохим последствиям: прямой доступ к БД, запуск reverse shell с правами web сервера, RCE.
Возникновение уязвимостей такого типа вызвано следующим:
-
Использование потенциально опасных конструкций языков программирования.
некоторые функции различных языков передают полученные данные в ОС для последующего выполнения системных вызовов (
exec()
,passthru()
,eval()
,subprocess.popen()
и др.) -
Отсутствие обработки пользовательского ввода.
пользовательский ввод никак не обрабатывается и введенные пользователем данные интерпретируюся как команда или параметры.
Из перечисленных пунктов следует, что, к примеру, в имеющуся на сайте форму, вместе с вводимой информацией, можно через ;
ввести произвольную, самостоятельную команду которая будет выполнена.
Примеры
PHP passthru
В нижепредставленном псевдо PHP коде, в $command_string
попадает пользовательский ввод, который затем в чистом виде попадает в функцию passthru()
которая выполняет переданные её параметры.
<?php
if (isset($_GET["command_string"])) {
$command_string = $_GET["command_string"];
try {
passthru($command_string);
} catch (Error $error) {
echo "<p class=mt-3><b>$error</b></p>";
}
}
?>
PHP exec
В следующем сниппете небезопасно используется exec()
.
<?php
$books "/var/www/html/books"
if isset($_GET["title"]) {
$title=$_GET["title"];
$command = "grep $title /var/www/html/bookstitle.txt";
$search = exec($command);
if ($search == "") {
$return = "<p>Нет книги с таким названием</p>"
} else {
$return = "<p>Есть такая книга!</p>"
}
echo $return
}
?>
Python.Flask subroccess
В этом примере небезопасно спроектирована маршрутизация по страницам сайта.
import subprocess
from flask import Flask
app = Flask(__name__)
def execute_command(shell):
return subprocess.popen(shell, shell=True, stdout=subprocess.PIPE).stdout.read()
@app.route('/<shell>')
def command_server(shell):
return execute_command(shell)
Обнаружение возможности использования Command Injection
Перед тем как писать о теме подзаголовка, следует зафиксировать информацию о том, что по способу выполнения существует 2 вида Command Injection:
-
Blind Command Injection - результат выполнения не имеет прямого вывода. Нужно найти подветрждение выполнения внедрённого кода.
-
Verbose Command Injection - результат выполнения имеет прямой вывод и отобразится на странице в которую был внедрён код.
В качестве обнаружения возможности использования Command Injection можно отправлять в качестве payload например следующие команды: whoami
, ls
, nc
, sleep
, ping
, curl
- для web серверов на Linux и whoami
, dir
, ping
, timeout
для серверов на Windows
Способы противодействия
Отказаться от использования уязвимых конструкций, а в случае невозможности - строго определить множество допустимых значений подаваемых на вход таких функций.
Использовать списки допустимых символов и сравнивать пользовательский ввод с этим списком.
Обрабатывать пользовательский ввод перед его дальнейшей передачей (шринкать или экранировать запрещенные символы)