Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Injection - Użyj zapytania SELECT do UPDATE/DELETE

Zanim bezpośrednio odpowiesz na pytanie, warto zauważyć, że nawet jeśli atakujący może tylko czytać dane, których nie powinien być w stanie, to zazwyczaj nadal bardzo źle. Rozważ to, używając JOIN s i WYBIERZ z tabel systemowych (takich jak mysql.innodb_table_stats ), atakujący, który zaczyna od SELECT wstrzyknięcie i brak innej wiedzy o Twojej bazie danych może zmapować twój schemat, a następnie wydobyć wszystkie dane, które masz w MySQL. W przypadku ogromnej większości baz danych i aplikacji już reprezentuje katastrofalną lukę w zabezpieczeniach.

Ale aby odpowiedzieć bezpośrednio na pytanie:znam kilka sposobów, dzięki którym wstrzyknięto do SELECT MySQL może służyć do modyfikacji danych. Na szczęście wszystkie wymagają rozsądnie możliwe są nietypowe okoliczności. Wszystkie przykładowe wstrzyknięcia poniżej są podane w odniesieniu do przykładowego zapytania do wstrzykiwania z pytania:

SELECT id, name, message FROM messages WHERE id = $_GET['q']

1. Zapytania „skumulowane” lub „grupowe”.

Klasyczna technika wstrzykiwania polegająca na wstawianiu całej innej instrukcji po tym, do której została wstrzyknięta. Jak zasugerowano w inna odpowiedź tutaj , możesz ustawić $_GET['q'] do 1; USUŃ Z użytkowników; -- tak, że zapytanie tworzy dwie instrukcje, które są wykonywane kolejno, z których druga usuwa wszystko w użytkownikach tabela.

W ramach łagodzenia

Większość konektorów MySQL - w szczególności PHP (przestarzałe) mysql_* i (nieprzestarzałe) mysqli_* funkcje — nie obsługują w ogóle zapytań skumulowanych ani wsadowych, więc ten rodzaj ataku po prostu nie działa. Jednak niektórzy tak - w szczególności w tym złącze PHP PDO (chociaż wsparcie można wyłączyć w celu zwiększenia bezpieczeństwa ).

2. Wykorzystywanie funkcji zdefiniowanych przez użytkownika

Funkcje mogą być wywoływane z SELECT i może zmieniać dane. Jeśli w bazie danych utworzono funkcję zmieniającą dane, możesz wykonać SELECT wywołaj to, na przykład przekazując 0 LUB JAKĄŚ_FUNKCJĘ_NAZWA() jako wartość $_GET['q'] .

W ramach łagodzenia

Większość baz danych nie zawiera żadnych funkcji zdefiniowanych przez użytkownika – nie mówiąc już o funkcjach zmieniających dane – i dlatego nie oferuje żadnej możliwości wykonania tego rodzaju exploitów.

3. Zapis do plików

Jak opisano w artykule Muhaimina Dzulfakara (nieco zarozumiale nazwanym) Zaawansowane wykorzystanie MySQL , możesz użyć INTO OUTFILE lub DO ZRZUTU klauzule na zaznaczeniu MySQL, aby zrzucić wynik do pliku. Ponieważ, używając UNION , dowolny wynik może być SELECT ed, pozwala to na pisanie nowych plików z dowolną zawartością w dowolnym miejscu, w którym użytkownik uruchamia mysqld można uzyskać dostęp. Niewykluczone, że można to wykorzystać nie tylko do modyfikacji danych w bazie danych MySQL, ale także do uzyskania dostępu powłoki do serwera, na którym działa - na przykład poprzez napisanie skryptu PHP do webroota, a następnie wysłanie do niego żądania, jeśli Serwer MySQL jest współhostowany z serwerem PHP.

W ramach łagodzenia

Wiele czynników zmniejsza praktyczną możliwość wykorzystania tego skądinąd imponująco brzmiącego ataku:

  • MySQL nigdy pozwól ci użyć INTO OUTFILE lub DO ZRZUTU nadpisać istniejący plik, ani zapisywać do folderu, który nie istnieje. Zapobiega to atakom, takim jak tworzenie pliku .ssh folder z kluczem prywatnym w mysql katalog domowy użytkownika, a następnie SSH lub nadpisanie mysqld plik binarny ze złośliwą wersją i czekający na ponowne uruchomienie serwera.
  • Każdy w połowie przyzwoity pakiet instalacyjny skonfiguruje specjalnego użytkownika (zwykle o nazwie mysql ), aby uruchomić mysqld i nadaj temu użytkownikowi tylko bardzo ograniczone uprawnienia. Jako taki, nie powinien być w stanie pisać do większości lokalizacji w systemie plików - i na pewno nie powinien być w stanie robić takich rzeczy, jak pisanie do webroota aplikacji internetowej.
  • Nowoczesne instalacje MySQL są dostarczane z --bezpieczny-plik-priv ustawione domyślnie, zapobiegając zapisywaniu MySQL w innym miejscu niż wyznaczony katalog importu/eksportu danych i tym samym czyniąc ten atak prawie całkowicie bezsilnym... chyba że właściciel serwera celowo go wyłączył. Na szczęście nikt nigdy nie wyłączyłby takiej funkcji zabezpieczającej jak ta, ponieważ byłoby to oczywiste - oh czekaj, nieważne .

4. Wywołanie sys_exec() funkcja z lib_mysqludf_sys uruchamiać dowolne polecenia powłoki

Istnieje rozszerzenie MySQL o nazwie lib_mysqludf_sys to - sądząc po jego gwiazdach na GitHubie i szybkie wyszukiwanie przepełnienia stosu - ma co najmniej kilkuset użytkowników. Dodaje funkcję o nazwie sys_exec który uruchamia polecenia powłoki. Jak zauważono w punkcie 2, funkcje można wywoływać z wnętrza SELECT; miejmy nadzieję, że implikacje są oczywiste. Cytując ze źródła , ta funkcja "może stanowić zagrożenie bezpieczeństwa" .

W ramach łagodzenia

Większość systemów nie ma zainstalowanego tego rozszerzenia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nieznana kolumna „” na „liście pól”. Django

  2. MYSQL jak odblokować tabelę jeśli użyłem polecenia LOCK table nazwa_tabeli WRITE;

  3. Jak działa funkcja UNHEX() w MySQL

  4. PHP:dlaczego nie mogę zapętlić dwa razy na wynikach mysqli_fetch_array()?

  5. Jak sprawdzić, czy nazwa użytkownika już istnieje w PHP/MYSQL?