2011-12-16 12 views
6

Krótko mówiąc, przez starą stronę ASP uruchamiam kogoś, kto znalazł niefiltrowany parametr adresu URL i udało mu się uruchomić to zapytanie. Próbuję dowiedzieć się, co robi, choć ...Co robi ten zastrzyk SQL?

Zapytanie powinien brzmieć:

select * from reserve where id = 345 

ten, który był Ran było:

select * from reserve where id = 345 and ascii(substring((select concat(user,0x3a,password,0x3a,host) from mysql.user limit 0,1),17,1))=53 

ja naprawdę nie jestem pewien co to daje. Dowolne wejście?

+0

Wygląda na to, że próbują zawęzić zestaw znaków, którego używa db. –

+0

Dziwne, to zapytanie pojawia się w całym Internecie - choć nie na angielskich stronach heh .. Zapytanie wygląda dla mnie jednak bezużytecznie! Najwyraźniej czegoś szukają. –

Odpowiedz

5

Może to oznaczać, czy aplikacja internetowa ma dostęp do bazy danych jako root. Usuwanie ascii(substring()) porcje zwraca następujący gdy uruchamiane jako root: Po udanym sondy

mysql> select concat(user,0x3a,password,0x3a,host) from mysql.user limit 0,1; 
+--------------------------------------+ 
| concat(user,0x3a,password,0x3a,host) | 
+--------------------------------------+ 
| root:<rootpw-hash>:localhost   | 
+--------------------------------------+ 

, mogą potem próbować odzyskać zawartość mysql.user z którego można rozpocząć pękanie haseł przeciwko tęczowe tablice.

+0

Interesujące domysły. Wygląda na to, że zapytanie chce wiedzieć, czy 17-ty znak tej konkatenacji to ASCII char 53, który jest numerem 5. –

+0

@MikeChristensen Właśnie badam to. W moim przypadku zwrócił on ascii 52 (cyfra 4), więc może szukać pustych haseł lub jakiegoś dobrze znanego hasła domyślnego. –

+0

Tak, chociaż moglibyśmy zapytać o 'user = 'root'' i' password = 'i na tym koniec. –

2

SQL próbuje odczytać dane użytkownika z tabeli użytkowników My-Sql, która zazwyczaj zawiera listę użytkowników i hostów, którzy mają dostęp do danego serwera my-sql.

Wygląda na to, że osoba próbująca oszukać mysql w celu wyrzucenia zawartości tabeli użytkownika, aby następnie mógł zarejestrować skróty hasłowe w trybie offline i dcryptować je w celu znalezienia prawidłowych loginów.

Jeśli twoja aplikacja internetowa używa loginu, który pozwoli na dostęp do tabeli użytkowników mysql, to jest to poważna wada bezpieczeństwa, jeśli używa loginu, który ma uprawnienia tylko do tabel wymaganych dla aplikacji, to nie ma informacji będą dostępne.

wskazówka bezpieczeństwa: Przy tworzeniu wszelkiego rodzaju bazy danych jest to niezwykle ważne, że aplikacja korzystająca robi to z rolą login/dostępu, który udziela go tylko to, czego potrzebuje.

Jeśli twoja aplikacja potrzebuje tylko do odczytu danych i nigdy ich nie modyfikuje, to nigdy nie powinna mieć żadnych uprawnień poza czytaniem. Zawsze trzeba to sprawdzić dwukrotnie, ponieważ większość systemów baz danych domyślnie tworzy role użytkowników dla danej bazy danych z pełnym odczytem, ​​tworzeniem, modyfikowaniem uprawnień.

Zawsze twórz określonego użytkownika, tylko dla tej bazy danych i/lub zbioru tabel, i zawsze dawaj temu użytkownikowi absolutne minimum, które jest wymagane, jeśli twoja aplikacja zostanie następnie zhakowana przez atak z użyciem skryptów krzyżowych, większość z nich będzie uzyskać dostęp, to ta konkretna baza danych.

2

Druga część, gdzie stan jest naprawdę dziwne: wygląda na MySQL poświadczeń i przetwarzać je w następujący sposób:

  • concat (użytkownik, 0x3a, hasło 0x3a, host) będzie coś w stylu „someUser : hisPass: localhost”
  • powyższy ciąg zostanie podzielony na mniejsze
  • powyższego łańcucha jest konwertowany do kodu aSCII (może znasz go od starszych języków jak ord())
  • wynikiem konwersji jest porównywany z 53 liczbą całkowitą

Przypuszczam, że pierwsza część WHERE (id = 345) zawsze zwróci true natomiast drugi jest zbyt szczegółowe, więc cała kwerenda będzie prawdopodobnie zwróci pusty Wynik cały czas.

2

zapytanie jest pozornie jeden z zestawem nich:

  • poprzez zmianę położenia charCode i podciąg startu i można znaleźć wszystkie nazwy użytkowników i odpowiadające im skróty haseł (gdy strona renderuje jak oczekiwano ci mieć dopasowanie char)
  • pozwala dowiedzieć się, że bieżący użytkownik ma dostęp do schematu mysql.
+0

Jakie informacje masz na temat" zestawu " "? Jakieś linki czy coś? –

+0

@ neil-m, nie mam żadnych konkretnych informacji. Zapytanie sprawdza, czy kod 17 elementu konkatenacji nazwy użytkownika + passhash ma wartość 53. Atakujący już wie, że bieżący użytkownik ma dostęp do tabel systemowych i odczytał już 16 znaków z wynikowego wiersza. – newtover

+0

@ nail-m, i znając hashcode swojej passwo, atakujący może przeszukać go w tęczowym stole i znaleźć hasło lub inny ciąg, który miałby tę samą wartość hash – newtover

2

Exploit sql injection niekoniecznie natychmiast wyświetla wynik zapytania na ekranie napastnika, często wynikiem jest tylko błąd lub brak błędu, lub może wstrzyknięcie powoduje mierzalne opóźnienie (do atakującego). w ten sposób atakujący może uzyskać 1 bit informacji na żądanie.

Wysyłając wiele żądań, iterując po pozycjach ciągowych, wykonując binarne wyszukiwanie znaków - lub, jak w tym przypadku, wyszukiwanie liniowe (które może wskazywać, że atakujący tak naprawdę nie rozumie, co robi, ale ostatecznie tam dotrze), będzie mógł znaleźć wszystkie znaki w mysql root passwordhash. (Które mogą być bruteforced offline).