post_ico4

(Nie)bezpieczny kod – Shell injection

Metoda ataku Shell injection (znana także jako Command injection) polega na wstrzyknięciu komendy systemowej przy wykorzystaniu funkcji PHP takich jak exec(), system(), shell_exec(), passthru().

Trochę teorii

PHP umożliwia wykonanie za pomocą np. funkcji exec() komend systemowych serwera. Jeżeli w argumencie funkcji zostaną wstawione nieprzefiltrowane dane od użytkownika (np. z tablicy GET lub POST) może on wykonać niepożądane akcje na serwerze. Przy braku odpowiednich zabezpieczeń na serwerze, użytkownik może nawet usunąć pliki.

Przykładowy atak Shell injection

Żeby umożliwić atak potrzebujemy następującego skryptu:

<?php
if(isset($_POST['shell'])) {
    echo exec('ls '.$_POST['shell']);
}
?>
<form method="post" action="">
    Nazwa katalogu: <input type="text" name="shell">
    <input type="submit" value="OK">
</form>

Powyższy kod ma za zadanie wyświetlić listę plików ze wskazanego katalogu. Jeżeli użytkownik wpisze coś takiego:

;cat nazwa pliku

na słabo zabezpieczonym serwerze, poza listą plików bieżącej ścieżki skryptu, zostanie wyświetlona zawartość wskazanego pliku. Chyba nie muszę mówić czym to może grozić… :)

Jak się zabezpieczyć przed Shell injection?

Żeby zabezpieczyć się przed Shell injection niezbędne jest filtrowanie danych od użytkownika. Jeżeli w funkcji wymagana jest liczba sprawdzamy czy podał liczbę, jeżeli określony znak – sprawdzamy, czy to co wpisał użytkownik zawiera się w liście dozwolonych znaków itd.

Dodatkowo PHP udostępnia 2 funkcje, które pomogą zabezpieczyć skrypt. Funkcja escapeshellarg() zabezpiecza argumenty komendy dodając apostrof na początku i końcu ciągu. Druga funkcja to escapeshellcmd() – ona z kolei znaki: #&`|*?~<>^()[]{}$\, \x0A, \xFF, ‚ oraz ” poprzedza backslash’em (\). Dzięki niej blokowane są łączenia m.in. komend. Poprawiony kod wygląda następująco:

<?php
if(isset($_POST['shell'])) {
    echo exec('ls '.escapeshellarg(escapeshellcmd($_POST['shell'])));
}
?>
<form method="post" action="">
    Nazwa katalogu: <input type="text" name="shell">
    <input type="submit" value="OK">
</form>

Uwaga: informacje przedstawione w artykule służą tylko celom edukacyjnym. ZABRONIONE jest wykorzystywanie informacji przedstawionych w artykule do celów niezgodnych z prawem. Autor nie ponosi odpowiedzialności za ewentualne szkody.

Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (Brak ocen, bądź pierwszy!)
Loading...
  • hhh

    to się opisałeś

  • WooDzu

    Warto dodac ze kazda z tych funkcji mozna wylanczyc w php.ini przez parametr disable_functions jesli nie sa uzywane a nie powinny byc. Ryzyko jest dosc spore.