SQL-ін'єкція
Огляд
SQL injection is a type of attack that uses vulnerabilities in an application's input validation or data typing for SQL queries.
У разі успіху атака дозволяє зловмиснику ввести дані в існуючий запит SQL. Тоді зловмисник може отримати приватні дані, спричинити відмову в обслуговуванні або викликати інші ненавмисні реакції. У найгіршому випадку введений код дозволить зловмиснику отримати повний контроль над системою, використовуючи численні вразливості сервера баз даних, системних утиліт та операційної системи.
Щоб отримати огляд атак із застосуванням SQL, перегляньте сторінку SQL Injection у Вікіпедії.
Приклад
Наступний фрагмент коду дозволить зловмиснику виконувати власні команди SQL (і є синтаксичною помилкою в Oracle).
$limit = $wgRequest->getVal( 'limit' );
$res = $db->query( "SELECT * from kitties LIMIT $limit" );
Бажаним способом виконання наведеного вище запиту буде:
$limit = $wgRequest->getVal( 'limit' );
$limit = intval( $limit ); // OPTIONAL validation
$res = $db->select( 'kitties',
'*',
false,
__METHOD__,
array( 'LIMIT' => $limit ) // REQUIRED automatic escaping
);
See Manual:Database access for more recent approaches to building SQL queries using the SelectQueryBuilder class.
Щоб використати вразливість і отримати електронні адреси зареєстрованих користувачів вікі, зловмисник використає рядок GET:
?limit=%201%20union%20select%20user_email%20from%20user;
SQL-ін'єкція і MediaWiki
MediaWiki має користувацький інтерфейс генерації SQL, який підтвердив свою ефективність в усуненні вразливостей ін'єкції SQL. Інтерфейс генерації SQL також забезпечує абстракцію СУБД і такі функції, як префікси таблиць.
Щоб захистити MediaWiki від ін’єкції SQL:
- avoid using direct SQL queries at all costs
- review Manual:Database access and use the functions provided in Database.php
- read the The Open Web Application Security Project's page on SQL injection (http://www.owasp.org/index.php/SQL_Injection)
- The SQL Injection Wiki: http://www.sqlinjectionwiki.com/