CGI - ERRATA

W poprzednim numerze MI ukazał się artykuł pt. "CGI - sposób na dynamiczne strony WWW". Ostrzegałem w nim między innymi, że skrypty CGI mogą stanowić zagrożenie bezpieczeństwa serwera. I oto moje ostrzeżenie znalazło potwierdzenie już w tym samym artykule, a konkretnie w ostatnim z przedstawionych w nim skryptów, umożliwiającym przeszukiwanie plików znajdujących się na serwerze! Sprawdziło się przysłowie "co nagle, to po diable" - przygotowany "na gorąco" na potrzeby artykułu skrypt okazał się zawierać poważną lukę w bezpieczeństwie.

Otóż ze względu na sposób użycia przez skrypt komendy grep do przeszukiwania plików, wprowadzany przez użytkownika tekst nie może zawierać cudzysłowów. Nie byłoby to może zbyt wielką wadą, gdyby nie fakt, że jeżeli złośliwy użytkownik jednak tych cudzysłowów - w odpowiedni sposób - użyje, może skłonić serwer do wykonania zupełnie dowolnej komendy unixowej z uprawnieniami, z jakimi pracuje program serwera WWW (odkrycie "magicznej" kombinacji znaków, która to umożliwia, pozostawiam dociekliwości Czytelników). Z reguły uprawnienia te nie pozwalają wprawdzie na wyrządzenie istotniejszych szkód w systemie, niemniej jednak sam fakt istnienia takiej "furtki", umożliwiającej nieautoryzowane wykonywanie dowolnych komend, może stanowić dla hackera dobry pierwszy krok do prób dalszego włamywania się na serwer...

Pora zatem przedstawić poprawioną wersję skryptu, pozbawioną tego błędu. Zmiany wymaga jedynie początkowa część skryptu, która powinna wyglądać następująco:

     #!/usr/bin/perl
     use CGI;
     CGI::ReadParse(*form);

     $search = $form{'slowo'};
     $search =~ s/"/\\"/g;

     @files=`grep -li "$search" *.html`;

     print "Content-type: text/html; charset=ISO-8859-2\n\n";
     ( ... i dalej tak jak poprzednio ...)
Istotnym elementem jest tu instrukcja $search =~ s/"/\\"/g, która na użytek komendy grep zamienia niebezpieczne znaki cudzysłowów na "bezpieczne" kombinacje \" (backslash-cudzysłów), uniemożliwiając wykorzystanie opisanej "sztuczki".

Serdecznie przepraszam Czytelników za błąd i niech sytuacja ta będzie jeszcze jednym dowodem na to, jak wielką uwagę trzeba przy pisaniu skryptów CGI przykładać do kwestii bezpieczeństwa.


Jarosław Rafa 2000. Tekst udostępniony na licencji Creative Commons (uznanie autorstwa - użycie niekomercyjne - bez utworów zależnych). Kliknij tutaj, aby dowiedzieć się, co to oznacza i co możesz z tym tekstem zrobić. W razie jakichkolwiek wątpliwości licencyjnych bądź w celu uzyskania zgody na rozpowszechnianie wykraczające poza warunki licencji proszę o kontakt e-mailem: raj@ap.krakow.pl.

Wersja HTML opracowana 5.06.2000.


Powrót do wykazu artykułów o Internecie Statystyka