Łukasz Pilorz
Bezpieczeństwo aplikacji internetowych

17 sty 07 Demonstracja błędu w funkcji unset()

Błąd w PHP umożliwiający między innymi obejście funkcji unset() jest znany od roku (publicznie nieco krócej). Jest szczególnie groźny przy włączonej dyrektywie register_globals, ale poza tablicą $_GLOBALS umożliwia też ataki przy pomocy $_FILES, $_GET itd.

Problem bierze się stąd, że PHP przed wersjami 4.4.3 i 5.1.4 przy usuwaniu elementu tablicy nie odróżniało indeksu liczbowego od skrótu klucza tekstowego (ma on również formę liczby całkowitej). Dlatego tworząc element tablicy o odpowiednim indeksie liczbowym można było spowodować, że zostanie on usunięty zamiast właściwego argumentu funkcji unset(). Szczegółowe wyjaśnienie można znaleźć na stronie Hardened-PHP, natomiast pod adresem http://lukasz.pilorz.net/testy/zend_hash/ przygotowałem prostą demonstrację błędu. Praktyczny przykład ataku (w tym przypadku na WordPress < 2.0.7) stworzył rgod.

Swój serwis można chronić aktualizując wersję PHP, wyłączając register_globals (częściowa ochrona) lub upewniając się, że bezpieczeństwo kodu aplikacji nie jest zależne od poprawnego działania funkcji unset(). Przykładowe zabezpieczenie (niekoniecznie wzorowe, ale wystarczające): changeset 4717 w WordPress.



Leave a Comment