Wstrzykiwanie kodu SQL

This page is a translated version of the page SQL injection and the translation is 95% complete.
Outdated translations are marked like this.

Przegląd

Wstrzykiwanie kodu SQL to rodzaj ataku [1], który wykorzystuje luki w walidacji danych wejściowych aplikacji lub typowaniu danych dla zapytań SQL.

Gdy atak się powiedzie, atakujący może wstrzyknąć dane do istniejącego zapytania SQL. Atakujący może wtedy pobrać prywatne dane, spowodować odmowę usługi lub wywołać inne niezamierzone reakcje. W najgorszym przypadku wstrzyknięty kod pozwoliłby atakującemu uzyskać pełną kontrolę nad systemem poprzez wykorzystanie wielu luk w serwerze bazy danych, narzędziach systemowych i systemie operacyjnym.

Przegląd ataków SQL injection można znaleźć na stronie Strona Wikipedii dotycząca wstrzykiwania SQL.

Przykład

Poniższy fragment kodu pozwoliłby atakującemu na wykonanie własnych poleceń SQL (i jest błędem składni w Oracle).

$limit = $wgRequest->getVal( 'limit' );
$res = $db->query( "SELECT * from kitties LIMIT $limit" );

Przed wersją MW 1.35 preferowanym sposobem uruchomienia powyższego zapytania było:

$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.

Aby wykorzystać lukę i pobrać adresy e-mail zarejestrowanych użytkowników wiki, atakujący użyłby ciągu GET o długości:

?limit=%201%20union%20select%20user_email%20from%20user;


Wstrzykiwanie kodu SQL i MediaWiki

MediaWiki ma niestandardowy interfejs generowania SQL, który okazał się skuteczny w eliminowaniu luk w zabezpieczeniach wstrzyknięciu kodu SQL. Interfejs generowania SQL zapewnia również abstrakcję DBMS i funkcje takie jak prefiksy tabeli.

Aby zabezpieczyć MediaWiki przed wstrzyknięciem kodu SQL: