Command Injection

Command Injection

Niezabezpieczony formularz

Command Injection (wstrzykiwanie poleceń) to technika, która pozwala atakującemu na wykonywanie dowolnych poleceń w systemie operacyjnym za pośrednictwem podatnej aplikacji. W niezabezpieczonej wersji, 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("ping -n 4 " . $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 niezabezpieczonej wersji, atakujący może wprowadzić dowolne polecenie systemowe, co stanowi zagrożenie dla serwera.
Spróbuj wpisać w pole adresu IP nie tylko jakiś adres , ale również jakieś polecenie systemowe, np. whoami, które zwróci nazwę użytkownika, na którym działa serwer. Przykładowo, wprowadź w pole adresu IP następujące dane:

                        
                            google.com & whoami
                        
                    

Widzimy, że oprócz standardowego wyjścia polecenia ping, użytkownik dostaje również informację, z jakiego konta zostało wykonane polecenie. W ten sposób, atakujący może dowiedzieć się, na jakim koncie działa serwer. Warto zauważyć, że świadomy tej podatności użytkownik ma możliwość wykonania DOWOLNEGO polecenia. Może on otwierać oraz modyfikować pliki, a nawet je usuwać! Przykładowo w celu sprawdzenia katalogu głównego serwera, wystarczy wpisać w pole adresu IP następujące dane:

                        
                            google.com & dir
                        
                    

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("ping -n 4 " . $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.

Spróbuj wykonać to samo co w poprzednich formularzach, ale na zabezpieczonej wersji formularza. Zobaczysz, że komendy wpisywane do pola adresu IP nie będą wykonywane, a jedynie wyświetlane jako tekst.