Łukasz Pilorz
msgbartop
Bezpieczeństwo aplikacji PHP
msgbarbottom

15 Feb 07 Czytanie zawartości katalogów chronionych open_basedir

Kilka tygodni temu natknąłem się przypadkiem na taki błąd w skrypcie PHP (4.4.1/5.5.1):

Warning: glob(): open_basedir restriction in effect. File(../adam) is not within the allowed path(s): ([...]) in /var/www/lukasz/script.php on line 5

Spowodowany był wywołaniem funkcji glob(’../*’), gdy katalog nadrzędny nie był objęty listą dozwolonych ścieżek w open_basedir. Ciekawe jest, że w błędzie mamy informację o pliku, do którego nie mamy dostępu, pomimo że jego nazwa nie jest określona w parametrze funkcji. Możemy w takim razie próbować dalej - glob(’../a*’) :

Warning: glob(): open_basedir restriction in effect. File(../adam) is not within the allowed path(s): ([...]) in /var/www/lukasz/script.php on line 5

glob(’../b*’) - brak błędu… glob(’../c*’):

Warning: glob(): open_basedir restriction in effect. File(../cgi) is not within the allowed path(s): ([...]) in /var/www/lukasz/script.php on line 5

Przy pewnej dozie cierpliwości można zatem uzyskać informację o zawartości katalogu chronionego przez open_basedir. Skrypt, który można znaleźć tutaj, robi to za pomocą ob_get_contents(), z dokładnością jednego pliku na daną literę w katalogu.

Luka ta jest niezbyt groźna. Ma znaczenie przede wszystkim na współdzielonych serwerach hostingowych - te zaś, jeśli stosują open_basedir jako jedyne zabezpieczenie, mają znacznie poważniejsze problemy (PHP ma długą historię zgłoszeń dotyczących bezpieczeństwa tej opcji). Jak się okazało, półtora roku przede mną tę samą lukę odkrył Peter Brodersen: http://seclists.org/fulldisclosure/2005/Sep/0001.html.

Aktualizacja (15 lutego): Polecam też notkę Open_basedir confusion na blogu Stefana Essera.



Leave a Comment