Перейти к содержанию

Command Injection


Дефекты приложения приводящие к возможности выполнения неавторизованного кода на сервере.

В зависимости от типа используемого ПО различают: SQL, командные, XEE, email инъекции. Каждая из них может привести к максимально плохим последствиям: прямой доступ к БД, запуск reverse shell с правами web сервера, RCE.

Возникновение уязвимостей такого типа вызвано следующим:

  • Использование потенциально опасных конструкций языков программирования.

    некоторые функции различных языков передают полученные данные в ОС для последующего выполнения системных вызовов (exec(), passthru(), eval(), subprocess.popen() и др.)

  • Отсутствие обработки пользовательского ввода.

    пользовательский ввод никак не обрабатывается и введенные пользователем данные интерпретируюся как команда или параметры.

Из перечисленных пунктов следует, что, к примеру, в имеющуся на сайте форму, вместе с вводимой информацией, можно через ; ввести произвольную, самостоятельную команду которая будет выполнена.

Примеры

PHP passthru

В нижепредставленном псевдо PHP коде, в $command_string попадает пользовательский ввод, который затем в чистом виде попадает в функцию passthru() которая выполняет переданные её параметры.

vulnerable 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().

vulnerable 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:

  1. Blind Command Injection - результат выполнения не имеет прямого вывода. Нужно найти подветрждение выполнения внедрённого кода.

  2. Verbose Command Injection - результат выполнения имеет прямой вывод и отобразится на странице в которую был внедрён код.

В качестве обнаружения возможности использования Command Injection можно отправлять в качестве payload например следующие команды: whoami, ls, nc, sleep, ping, curl - для web серверов на Linux и whoami, dir, ping, timeout для серверов на Windows

Способы противодействия

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

Использовать списки допустимых символов и сравнивать пользовательский ввод с этим списком.
Обрабатывать пользовательский ввод перед его дальнейшей передачей (шринкать или экранировать запрещенные символы)