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 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
lubDO 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 wmysql
katalog domowy użytkownika, a następnie SSH lub nadpisaniemysqld
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.