sty
27

Historia zapytań MySQL

Załóżmy, że mamy pełny dostęp do maszyny pewnego użytkownika (logowanie przez SSH na konto roota). Załóżmy również, że jesteśmy wyjątkowo chciwi i chcemy poznać hasło właściciela przechowywane w bazie MySQL. Sprawę niech skomplikuje fakt, że wszystko trzymane jest w postaci zahashowanej algorytmem SHA-1. Zero szans na łamanie hasła metodami brute-force/tablicami tęczowymi. Jedyną iskierkę nadziei daje fakt, że kiedyś root wpisywał to hasło w SQL shell-u posługując się zapytaniem:
INSERT INTO tajne (my_password) VALUES (sha1('tajne_haselko'))
A to już wiele zmienia.


Wpisywane w powłoce bash polecenia przechowywane są w pliku ~/.bash_history . O ile z faktu istnienia tego pliku zdaje sobie chyba sprawę prawie każdy kto kiedykolwiek odpalił `ls –al` będąc w katalogu domowym, tak plik ~/.mysql_history może wydawać się większą niespodzianką.
Za każdym razem kiedy uruchamiamy MySQL z powłoki mamy do czynienia z tym plikiem. Przechowuje on wszystkie wpisane przez nas zapytania SQL. Oznacza to, że wyświetlając jego zawartość zobaczymy wszystkie zapytania wydawane przez zrootowanego właściciela serwera. Wśród nich będzie poszukiwana przez nas linijka:
INSERT INTO tajne (my_password) VALUES (sha1('tajne_haselko'))
z której z łatwością odczytamy zapisane w czystym tekście hasło.
Oczywiście zakładamy, że root nie wyłączył tworzenia ~/.mysql_history (a z doświadczenia wiem, że zwykle robi to bardzo mało osób). Zerknijmy jednak jak można zabronić MySQL tworzenia pliku historii zapytań do bazy. Jednym z najoczywistszych rozwiązań jest przekierowanie wszystkiego co ma zostać tam zapisane do /dev/null. Można zrobić to zwykłym dowiązaniem symbolicznym ` ln -s /dev/null ~/.mysql_history` lub pokusić się zabawą ze zmiennymi środowiskowymi MySQL.
MYSQL_HISTFILE przechowuje ścieżkę, mówiącą gdzie .mysql_history zostanie stworzony. Domyślnie jest to $HOME/.mysql_history. Zmienimy to wpisując `declare –x MYSQL_HISTFILE=/dev/null`.
Oczywiście takie rozwiązania nie jest optymalne. Historia zapytań czasem może okazać się bardzo przydatna podczas naszej pracy. Dużo lepszym rozwiązaniem byłoby usuwać ją po każdym wylogowaniu. Wtedy mielibyśmy pewność, ze nikt z niej nie skorzysta. Czyszczenie pliku można wykonać na wiele sposobów, ja wybrałem `echo > ~/.mysql_history`, które dodaje do pliku ~/.bash_logout (podczas wylogowywania się z powłoki wykonuje się jego zawartość). Użytkownicy środowisk graficznych powinni jednak zainteresować się innymi plikami. Przykładowo, wylogowując się w GNOME wywoływana jest zawartość /etc/gdm/PostSession/Default . To właśnie tam należy dodać linijkę odpowiedzialną za czyszczenie ~/.mysql_history (lub odpalić to co znajduje się w ~/.bash_logout).
Przechowywanie historii może okazać się bardzo niebezpieczne. Jeśli wpisujemy wrażliwe dane w niezaszyfrowanej/zahashowanej postaci warto upewnić się, czy nie zostały one zapisane do plików historii, a jeśli zostały – powinniśmy usunąć je jak najszybciej.

  

Dodaj komentarz

*

Audio-CAPTCHA