Tym razem w #od0dopentestera…

Tym razem w #od0dopentestera pod lupę weźmiemy #php

Czasami potrzebujemy umożliwić użytkownikowi pobranie plików z serwera.
Może on pobrać wszystkie pliki z konkretnego katalogu oprócz jednego – nazwanego u nas sekret.txt

$plik = basename((string) $ _GET[‚plik’]);
if (stristr($plik, ‚sekret.txt’) === false) {
echo file_get_contents ($plik);
}

Funkcja basename usuwa wszystkie znaki ../ oraz .. z parametru plik.
Dzięki temu jesteśmy pewni, że podany przez użytkownika adres do pliku nie zawiera katalogów nadrzędnych.

Następnie przy pomocy funkcji stristr sprawdzamy, czy podany ciąg nie zawiera słowa sekret.txt
Funkcja ta ma w swojej nazwie i co oznacza, ze nie rozróżnia wielkich i małych liter.
Zabezpieczamy się zatem przed sytuacją w której użytkownik podał by nazwę naszego pliku zaczynając od wielkiej litery i w ten sposób ominął filtr.

Gdzie zatem znajduje się dzisiejszy błąd?

Jak możemy przeczytać w dokumencie Oddities of PHP file access in Windows:

#webdev #programowanie #programista15k #informatyka #it #nauka #gruparatowaniapoziomu

Comments are closed.