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.


Copyright (C) 2000 Jarosław Rafa. Prawa autorskie zastrzeżone. Żadna część niniejszego tekstu nie może być nigdzie publikowana ani rozpowszechniana w jakiejkolwiek innej formie (włączając w to umieszczanie na innych serwerach w Internecie) bez pisemnej zgody autora.
Adres do korespondencji: raj@inf.wsp.krakow.pl.

Wersja HTML opracowana 5.06.2000.


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