Wstrzykiwanie kodu SQL
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:
- za wszelką cenę unikaj korzystania z bezpośrednich zapytań SQL
- przejrzyj Podręcznik:Dostęp do bazy danych i użyj funkcji zawartych w Database.php
- przeczytaj stronę The Open Web Application Security Project na temat wstrzykiwania kodu SQL (http://www.owasp.org/index.php/SQL_Injection)
- Wstrzyknięcie kodu SQL Wiki: http://www.sqlinjectionwiki.com/