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.
Powrót do wykazu artykułów o Internecie | Statystyka |