Czasami programiści…

Czasami programiści zakładają, że niektóre funkcje są bezpieczne ze względu na swoją naturę.
Co bowiem złego może się stać podczas sprawdzania czy dany plik istnieje na dysku.
Funkcja file_exists przyjmuje tylko jeden parametr i zwraca prawdę lub fałsz.
Ale jak to w #od0dopentestera bywa – diabeł tkwi w szczegółach.

class aplikacja {
function __construct($name) {
$this->name = 'pliki/’.$name;

if (strpos($this->name, "..") !== false) {
die('HACKER');
}

if (!file_exists($name)) {
echo 'PLIK NIE ISTNIEJE';
}
}

function __destruct() {
unlink($this->name);
}

}

W tym kawałku kodu sprawdzamy, czy plik o danej nazwie istnieje w katalogu pliki.
Jeżeli tak – usuwamy go przy pomocy funkcji unlink.

Chcemy obsługiwać wyłącznie ten jeden katalog – chronimy się przed atakiem path traversal sprawdzając, czy nie podano podwójnych kropek.
To chroni nas przed ciągami w stylu ./pliki/../../inny_katalog/.

Niektóre funkcje związane z odczytywaniem plików z dysku obsługują tak zwane wrapery.
To tak naprawdę inna nazwa na obsługę danego protokołu np. http czy https.
#php obsługuje format PHAR – czyli pewnego rodzaju archiwa, które mogą przechowywać całą aplikację w jednym pliku.
Można to porównać do plików JAR w Java.

Archiwum oprócz treści plików przechowuje także metadane.
Są one trzymane w zserializowanej formie – oznacza to że do ich odczytu używana jest funkcja unserialize.
Ona to jest niebezpieczna – ponieważ podczas jej użycia interpreter automatycznie wywołuje magiczne metody – co może doprowadzić do ataku object injection.

Wystarczy więc stworzyć paczkę PHAR z obiektem aplikacja, w której name ustawiamy na złośliwą wartość.
Taki plik wysyłamy na serwer a następnie odnosimy się do niego przy użyciu funkcji file_exists wykorzystując protokół phar://.
Wtedy to dany plik zostanie otwarty a podczas deserializacji metadanych zostanie wywołana magiczna metoda __destruct.
Dzięki temu możemy usunąć dowolny plik i ominąć zabezpieczenie.

Jeżeli chcesz być wołany dodaj się do Mirkolisty.
Masz pytanie na temat bezpieczeństwa? Zadaj je na grupie od 0 do pentestera na Facebooku.

#security #bezpieczenstwo #programowanie #programista15k #informatyka #it #nauka #technologia #ciekawostki #gruparatowaniapoziomu