LAB_02 / SYSTEM Średni

Jedno pole tekstowe. Dostęp do powłoki. Sprawdź, gdzie zaczyna się ryzyko.

Wskazówka do eksperymentu

Najpierw sprawdź zwykłe dane wejściowe. Następnie użyj przykładu z lekcji i porównaj wynik w wariancie podatnym oraz zabezpieczonym. W panelach kodu zaznaczono miejsca istotne dla ataku lub obrony.

Command Injection

01 / TEORIA · ⚠ PODATNY KOD

Podatny wariant

Command Injection (wstrzykiwanie poleceń) to technika, która pozwala atakującemu na wykonywanie dowolnych poleceń w systemie operacyjnym za pośrednictwem podatnej aplikacji. W podatnym wariancie dane użytkownika są bezpośrednio wstawiane do polecenia systemowego. Na przykład, w metodzie wykonującej polecenie ping:

                        
                        if (isset($_GET['ip'])) {
                            $ip = $_GET['ip'];
                            $output = shell_exec($pingCommand . $ip);
                            echo nl2br($output);
                        }
                        
                    
Polecenie systemowe jest tworzone przez konkatenację ciągu znaków z danymi użytkownika. Jeśli atakujący wprowadzi wartości, które zmieniają strukturę polecenia systemowego, może to prowadzić do niezamierzonych konsekwencji. W szczególności, używane są operatory typu ; & && | ||, które mogą zmienić strukturę polecenia systemowego. Dzięki temu, atakujący może wykonać dowolne polecenie systemowe na serwerze.

Przykładowy formularz służy do pingowania dowolnej strony internetowej. Do formularza należy wprowadzić adres IP strony, którą chcemy spingować. Następnie, po kliknięciu przycisku "Ping!", zostanie wykonane polecenie systemowe ping na podanym adresie IP. Warto zauważyć, że w podatnym wariancie, atakujący może wprowadzić dowolne polecenie systemowe, co stanowi zagrożenie dla serwera.
Spróbuj wpisać adres IP oraz polecenie whoami, które zwraca nazwę konta wykonującego polecenie. Użyj poniższego payloadu, czyli danych wejściowych przygotowanych do zademonstrowania podatności:

                        
                            127.0.0.1; whoami
                        
                    

02 / ATAK · PRZETESTUJ DANE WEJŚCIOWE

Wynik zawiera zarówno odpowiedź polecenia ping, jak i nazwę konta, na którym je wykonano. Ta sama podatność może umożliwiać odczyt, modyfikowanie lub usuwanie plików. Aby wyświetlić pliki w bieżącym katalogu roboczym, wypróbuj:

                        
                            127.0.0.1; ls
                        
                    

03 / OBRONA · ✓ ZABEZPIECZONY KOD

Sposoby obrony przed atakiem

Najlepszym sposobem na zabezpieczenie aplikacji przed atakami typu Command Injection jest unikanie bezpośredniego wstawiania danych użytkownika do polecenia systemowego. Jeżeli natomiast niezbędne jest wykonywanie poleceń systemowych na podstawie danych z formularzy, przede wszystkim należy bardzo dokładnie walidować te dane, aby upewnić się, że nie zawierają one żadnych niebezpiecznych znaków, takich jak & | && ||. Warto również ograniczyć dostęp do poleceń systemowych. Ponadto istnieją alternatywne metody, które pozwalają na bezpieczne wykonywanie poleceń systemowych. Jedną z nich jest użycie funkcji escapeshellarg(), która escapuje dane użytkownika, co oznacza, że są traktowane wyłącznie jako dane, a nie część polecenia systemowego. Na przykład, w zabezpieczonej metodzie, która wykonuje polecenie ping:

                        
                            if (isset($_GET['ip'])) {
                                $ip = escapeshellarg($_GET['ip']);
                                system($pingCommand . $ip);
                            }
                        
                    
Polecenie systemowe jest przygotowane z miejscem na parametr, które jest później wypełniane danymi użytkownika. Zapobiega to manipulacji struktury polecenia systemowego przez atakującego.

Wypróbuj ten sam payload w zabezpieczonym formularzu. Dane zostaną przekazane jako jeden argument, a nie wykonane jako dodatkowe polecenie. Program może odrzucić je jako nieprawidłowy adres.