MySQL – wyłączenie LOAD DATA LOCAL INFILE
Napisał: Patryk Krawaczyński
07/06/2010 w Ataki Internetowe, Bezpieczeństwo Brak komentarzy. (artykuł nr 263, ilość słów: 548)
W
yrażenie LOAD DATA LOCAL INFILE przy standardowej konfiguracji serwera MySQL potrafi wczytać do wcześniej spreparowanej tabeli dowolny plik z serwera posiadający globalne uprawnienia do odczytu. W celu skorzystania z tej możliwości wystarczy wskazać pełną ścieżkę do pliku, który musi znajdować się na tym samym serwerze, co oprogramowanie MySQL. Z powodzeniem wyrażenie to może zostać wykorzystane w jednej z technik SQL Injection (np. gdy w aplikacji webowej zostanie wykryta nowa luka) do odczytu wrażliwych z poziomu bezpieczeństwa plików konfiguracyjnych serwera i aplikacji lub wczytaniu plików konfiguracyjnych innych aplikacji na współdzielonym hostingu.
Na przykład w celu wczytania ogólnodostępnego pliku /etc/passwd zawierającego listę użytkowników systemu do tabeli shellusers wystarczy wykonać polecenia w bazie MySQL:
mysql> CREATE TABLE `shellusers` (`shellusers` VARCHAR(255)); Query OK, 0 rows affected (0.01 sec) mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE `shellusers`; Query OK, 29 rows affected (0.00 sec) Records: 29 Deleted: 0 Skipped: 0 Warnings: 0 mysql> SELECT * FROM shellusers; +------------------------------------------------------------------------------+ | shellusers | +------------------------------------------------------------------------------+ | root:x:0:0:root:/root:/bin/bash | | daemon:x:1:1:daemon:/usr/sbin:/bin/sh | | bin:x:2:2:bin:/bin:/bin/sh | | (...) | +------------------------------------------------------------------------------+ 29 rows in set (0.00 sec)
W ten sposób znając pełną ścieżkę np. do pliku konfiguracyjnego systemu WordPress (wp-config.php) innego konta na współdzielonym serwerze hostingowym możemy uzyskać pełne dane autoryzacyjne do bazy danych tego konta. Daje nam to również możliwość odczytywania plików konfiguracyjnych serwera mimo braku dostępu do jego powłoki poleceń. W celu wyłączenia możliwości użycia polecenia “LOCAL INFILE” przez wszystkich użytkowników wystarczy dodać następujący parametr w sekcji [mysqld]
pliku konfiguracyjnego serwera MySQL:
set-variable=local-infile=0
Wówczas przy próbie wywołania w/w składni użytkownik otrzyma następujący komunikat:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE `shellusers`; ERROR 1148 (42000): The used command is not allowed with this MySQL version
Więcej informacji: Security Issues with LOAD DATA LOCAL