SQL Column Truncation Vulnerability po polsku

Kiedy dostałem linka od mojego znajomego do notki Stefana Essera na temat ciekawych podatności MySQL, od razu zacząłem testować popularne skrypty pod kątem tego typu błędów. Oczywiście rozpocząłem od WordPress ;] Niestety, najprawdopodobniej nie byłem pierwszy, bo (co w sumie logiczne) Stefan dużo wcześniej przetestował ten skrypt i poinformował o usterce programistów WordPress.

W każdym razie, poniżej postarałem się ująć w kilku przykładach istotę tej klasy podatności.

mysql> CREATE TABLE test (login varchar (20) );
Query OK, 0 rows affected (0.39 sec)

mysql> INSERT INTO test VALUES ( 'admin' );
Query OK, 1 row affected (0.36 sec)

mysql> select * from test;
+-------+
| login |
+-------+
| admin |
+-------+
1 row in set (0.01 sec)

próba wstawienia 21-znakowego ciągu do pola 20 znakowego
powoduje obcięcie i wyrzucenie nadmiaru znaków (czyli
w tym wypadku wyrzucenie znaku 'x')

mysql> INSERT INTO test VALUES ( 'admin               x' );
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from test;
+----------------------+
| login                |
+----------------------+
| admin                |
| admin                |
+----------------------+
2 rows in set (0.00 sec)

mysql> select hex(login) from test;
+------------------------------------------+
| hex(login)                               |
+------------------------------------------+
| 61646D696E                               |
| 61646D696E202020202020202020202020202020 |
+------------------------------------------+
2 rows in set (0.03 sec)

mysql> select * from test where login='admin';
+----------------------+
| login                |
+----------------------+
| admin                |
| admin                |
+----------------------+
2 rows in set (0.02 sec)

mysql> select * from test where login='admin                ';
+----------------------+
| login                |
+----------------------+
| admin                |
| admin                |
+----------------------+
2 rows in set (0.00 sec)

Poza tym MySQL w standardowej konfiguracji ma ustawioną opcje max_packet_size na jeden megabajt. Jest to maksymalny rozmiar pakietu możliwego do przesłania pomiędzy serwerem SQL a klientem. Zatem gdy zapytanie przekroczy tą wartość, nie zostanie w ogóle wykonane. Najczęściej spowoduje to błąd w aplikacji webowej która wykona takie query.

Poprzez odpowiednią manipulację rozmiarem danych, można doprowadzić do sytuacji w której część zapytań nie wykona się, właśnie z powodu przekroczonego rozmiaru zapytania, a część z zapytań wykona się normalnie. W konsekwencji aplikacja może np. przestać działać poprawnie, utworzyć błędy bypass, w ogóle przestać działać itp.

1 comment so far

  1. […] This vulnerability has been published some days ago where an attacker could create a duplicated “admin” user and recover the legitimate “admin” password. SQL column truncation is an attacking technique whereby an attacker take advance of some kind of mismatch between an application and the database structure used by it. […]


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: