Próbuję zbudować listę funkcji, których można użyć do wykonania dowolnego kodu. Celem nie jest wylistowanie funkcji, które powinny być na czarnej liście lub w inny sposób zabronione. Chciałbym raczej mieć pod ręką grep
możliwą do użycia listę słów kluczowych z czerwoną flagą podczas przeszukiwania zaatakowanego serwera dla tylnych drzwi.
Chodzi o to, że jeśli chcesz zbudować wielozadaniowy złośliwy skrypt PHP - taki jak skrypt „powłoki sieciowej”, taki jak c99 lub r57 - będziesz musiał użyć jednej lub więcej stosunkowo niewielkiego zestawu funkcji gdzieś w pliku, aby umożliwić użytkownikowi wykonanie dowolnego kodu. Wyszukiwanie tych funkcji pomaga szybciej zawęzić stóg siana dziesiątek tysięcy plików PHP do stosunkowo niewielkiego zestawu skryptów, które wymagają dokładniejszego zbadania.
Oczywiście na przykład dowolne z poniższych byłoby uważane za złośliwe (lub straszne kodowanie):
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
i tak dalej.
Pewnego dnia przeszukując zaatakowaną witrynę, nie zauważyłem złośliwego kodu, ponieważ nie zdawałem sobie sprawy, preg_replace
że użycie /e
flagi może być niebezpieczne ( co, na serio? Dlaczego nawet tam jest ?). Czy są jeszcze jakieś inne, za którymi tęskniłem?
Oto moja lista do tej pory:
Shell Execute
system
exec
popen
backtick operator
pcntl_exec
PHP Wykonaj
eval
preg_replace
(z/e
modyfikatorem)create_function
include
[_once
] /require
[_once
] ( szczegółowe informacje na temat wykorzystania znajdują się w odpowiedzi Mario )
Przydatna może być również lista funkcji zdolnych do modyfikowania plików, ale wyobrażam sobie, że 99% kodu wykorzystującego czas będzie zawierało przynajmniej jedną z powyższych funkcji. Ale jeśli masz listę wszystkich funkcji zdolnych do edytowania lub wysyłania plików, opublikuj ją, a ja ją tutaj dołączę. (I nie liczę mysql_execute
, ponieważ jest to część innej klasy exploita.)
/e
modyfikator?e
modyfikator sprawia, że ciąg zastępujący jest oceniany jako kod PHP.Odpowiedzi:
Do zbudowania tej listy wykorzystałem 2 źródła. A Study In Scarlet and RATS . Dodałem też własne do miksu i ludzie z tego wątku pomogli.
Edycja: Po opublikowaniu tej listy skontaktowałem się z założycielem RIPS i odtąd narzędzia przeszukują kod PHP pod kątem użycia każdej funkcji z tej listy.
Większość tych wywołań funkcji jest sklasyfikowanych jako zlewy. Kiedy zmienna skażona (np. $ _REQUEST) jest przekazywana do funkcji sink, masz lukę. Programy takie jak szczurów i rozrywa użyć grep jak funkcjonalność zidentyfikować wszystkie umywalki w aplikacji. Oznacza to, że programiści powinni zachować szczególną ostrożność podczas korzystania z tych funkcji, ale jeśli wszystkie zostały zbanowane, nie będziesz w stanie wiele zrobić.
„ Z wielką mocą wiąże się wielka odpowiedzialność ”.
- Stan Lee
Wykonanie polecenia
Wykonanie kodu PHP
Poza
eval
tym istnieją inne sposoby wykonania kodu PHP:include
/require
można wykorzystać do zdalnego wykonania kodu w postaci luk w zabezpieczeniach Local File Include i Remote File Include .Lista funkcji akceptujących wywołania zwrotne
Funkcje te akceptują parametr ciągu, który może być użyty do wywołania funkcji wybranej przez atakującego. W zależności od funkcji atakujący może, ale nie musi, przekazać parametr. W takim przypadku można użyć
Information Disclosure
funkcji podobnej dophpinfo()
.Ujawnienie informacji
Większość tych wywołań funkcji nie jest zlewami. Ale może to być luka, jeśli jakiekolwiek zwrócone dane będą widoczne dla atakującego. Jeśli atakujący może
phpinfo()
to zobaczyć, jest to z pewnością luka.Inny
Funkcje systemu plików
Według RATS wszystkie funkcje systemu plików w php są nieprzyjemne. Niektóre z nich nie wydają się bardzo przydatne atakującemu. Inne są bardziej przydatne niż mogłoby się wydawać. Na przykład, jeśli
allow_url_fopen=On
adres URL może być użyty jako ścieżka do pliku, więccopy($_GET['s'], $_GET['d']);
można użyć wywołania do przesłania skryptu PHP w dowolnym miejscu w systemie. Również jeśli witryna jest podatna na żądanie wysyłane przez GET, każda z funkcji systemu plików może zostać wykorzystana do kierowania i atakowania innego hosta za pośrednictwem serwera.źródło
eval()
kodowania, wykonywania poleceń systemowych, uzyskiwania dostępu do bazy danych oraz odczytu / zapisu do plików. Atakujący może mieć wpływ na ten kod i jest to luka w zabezpieczeniach.preg_match
ze
nie szkodzi. Instrukcja mówi: „Tylko preg_replace () używa tego modyfikatora; jest on ignorowany przez inne funkcje PCRE”.Będziesz musiał skanować w poszukiwaniu include ($ tmp) i wymagać także (HTTP_REFERER) i * _once. Jeśli skrypt exploita może zapisać do pliku tymczasowego, może po prostu dołączyć go później. Zasadniczo ewolucja dwuetapowa.
Możliwe jest nawet ukrycie zdalnego kodu za pomocą obejść takich jak:
Ponadto, jeśli twój serwer został już skompromitowany, nie zawsze zobaczysz niezakodowane zło. Często powłoka exploita jest zakodowana w gzipie. Pomyśl o
include("zlib:script2.png.gz");
Brak ewaluacji tutaj, wciąż ten sam efekt.źródło
$_GET[xyz]
a nie$xyz
? A może było w tym coś głębszego?grep
. PHP - co za katastrofa.include
nie wymaga nawiasów;include "…"
wystarczy.Nie jest to odpowiedź sama w sobie, ale jest coś interesującego:
W tym samym duchu
call_user_func_array()
można go używać do wykonywania zaciemnionych funkcji.źródło
Dziwię się, nikt nie wspomniał
echo
, aprint
jako punkty eksploatacji zabezpieczeń.Cross-Site Scripting (XSS) to poważny exploit bezpieczeństwa, ponieważ jest jeszcze bardziej powszechny niż exploity do wykonywania kodu po stronie serwera.
źródło
szczególnie chciałbym dodać unserialize () do tej listy. Ma długą historię różnych luk, w tym wykonanie dowolnego kodu, odmowa usługi i wyciek informacji z pamięci. Nie należy nigdy wywoływać danych dostarczonych przez użytkownika. Wiele z tych vulsów zostało naprawionych w wydaniach w ciągu ostatnich lat rosy, ale wciąż zachowuje kilka paskudnych vulsów w chwili pisania.
Aby uzyskać inne informacje na temat podejrzanych funkcji / użycia php, przejrzyj projekt Hardened PHP i jego porady. Również ostatni miesiąc PHP Bezpieczeństwa i 2007 za miesiąc od PHP Bugs projektów
Zauważ też, że z założenia odserializowanie obiektu spowoduje wykonanie funkcji konstruktora i destruktora; kolejny powód, aby nie nazywać go danymi dostarczonymi przez użytkownika.
źródło
Mój VPS jest ustawiony, aby wyłączyć następujące funkcje:
PHP ma wystarczającą liczbę funkcji, które potencjalnie można zniszczyć, więc twoja lista może być zbyt duża, aby można było na nią grepować. Na przykład PHP ma chmod i chown, których można użyć do dezaktywacji strony internetowej.
EDYCJA: Być może możesz chcieć zbudować skrypt bash, który wyszukuje w pliku tablicę funkcji pogrupowanych według niebezpieczeństwa (funkcje, które są złe, funkcje gorsze, funkcje, których nigdy nie należy używać), a następnie obliczyć względność zagrożenia narzucony przez plik w procentach. Następnie wypisz to do drzewa katalogu z procentami oznaczonymi obok każdego pliku, jeśli jest większy niż próg, powiedzmy, 30% zagrożenia.
źródło
Należy również pamiętać o klasie „luk w zabezpieczeniach”, które umożliwiają odczyt i zapis dowolnych lokalizacji pamięci!
Wpływają one na funkcje takie jak trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () i więcej . Wynika to w dużej mierze, ale nie wyłącznie, ze względu na funkcję przejścia przez odniesienie do czasu języka, który był przestarzały przez 10 lat, ale nie był wyłączony.
Aby uzyskać więcej informacji, zobacz przemówienie Stefana Essera na temat podatności na zakłócenia i innych problemów PHP niższego poziomu na BlackHat USA 2009 Slides Paper
Ten artykuł / prezentacja pokazuje także, w jaki sposób można użyć dl () do wykonania dowolnego kodu systemowego.
źródło
Wektory wykonawcze specyficzne dla platformy, ale także teoretyczne:
I istnieje wiele innych ukrytych metod:
źródło
Oprócz
eval
konstrukcji języka istnieje jeszcze jedna funkcja, która umożliwia wykonanie dowolnego kodu:assert
źródło
Jedno źródło ciekawych exploitów nie zostało wspomniane. PHP pozwala na ciągi znaków w
0x00
bajtach. Funkcje bazowe (libc) traktują to jako koniec łańcucha.Pozwala to na sytuacje, w których (słabo zaimplementowane) sprawdzanie poprawności w PHP można oszukać, np. W sytuacji takiej jak:
Może to obejmować dowolny plik - nie tylko te kończące się
.php
- wywoływanyscript.php?file=somefile%00.php
Tak więc każda funkcja, która nie będzie przestrzegać długości łańcucha PHP, może spowodować pewną lukę.
źródło
Co z niebezpiecznymi elementami składniowymi?
„ Zmienna zmienna ” (
$$var
) znajdzie zmienną w bieżącym zakresie o nazwie $ var. W przypadku niewłaściwego użycia użytkownik zdalny może zmodyfikować lub odczytać dowolną zmienną w bieżącym zakresie. Zasadniczo słabszyeval
.Np .: piszesz trochę kodu
$$uservar = 1;
, a następnie użytkownik zdalny ustawia się$uservar
na „admin”, co powoduje$admin
ustawienie1
w bieżącym zakresie.źródło
$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.Myślę, że nie będziesz w stanie naprawdę znaleźć wszystkich możliwych exploitów podczas analizowania plików źródłowych.
także jeśli są tu naprawdę świetne listy, możesz przegapić funkcję, którą można wykorzystać
wciąż może istnieć „ukryty” zły kod
możesz teraz powiedzieć, że po prostu rozszerzam skrypt, aby go dopasować
ale wtedy będziesz miał ten „prawdopodobnie zły kod”, który dodatkowo jest poza jego kontekstem
tak być (pseudo-) zabezpieczyć, naprawdę powinieneś napisać dobry kod i czytać wszystkie istniejący kod siebie
źródło
Backtick Operator Backtick na php manual
źródło
Wiem,
move_uploaded_file
że zostało wspomniane, ale przesyłanie plików jest bardzo niebezpieczne. Sama obecność$_FILES
powinna budzić obawy.Możliwe jest osadzenie kodu PHP w dowolnym typie pliku. Obrazy mogą być szczególnie narażone na komentarze tekstowe. Problem jest szczególnie kłopotliwy, jeśli kod akceptuje rozszerzenie znalezione w
$_FILES
danych w stanie, w jakim się znajduje.Na przykład użytkownik może przesłać prawidłowy plik PNG z osadzonym kodem PHP jako „foo.php”. Jeśli skrypt jest szczególnie naiwny, może skopiować plik jako „/uploads/foo.php”. Jeśli serwer jest skonfigurowany tak, aby zezwalał na wykonywanie skryptów w katalogach wysyłanych przez użytkowników (często tak się dzieje i straszny niedopatrzenie), możesz natychmiast uruchomić dowolny dowolny kod PHP. (Nawet jeśli obraz zostanie zapisany jako plik .png, może być możliwe wykonanie kodu za pomocą innych błędów bezpieczeństwa.)
(Niewyczerpująca) lista rzeczy do sprawdzenia podczas przesyłania:
źródło
Dodajmy
pcntl_signal
, apcntl_alarm
do listy.Za pomocą tych funkcji można obejść wszelkie ograniczenia set_time_limit utworzone w php.ini lub w skrypcie.
Ten skrypt na przykład będzie działał przez 10 sekund pomimo
set_time_limit(1);
(Kredyt trafia do tweeta i istoty Sebastiana Bergmanna :
źródło
Istnieje wiele exploitów PHP, które można wyłączyć za pomocą ustawień w pliku PHP.ini. Oczywistym przykładem jest register_globals, ale w zależności od ustawień może być również możliwe dołączanie lub otwieranie plików ze zdalnych komputerów przez HTTP, które można wykorzystać, jeśli program używa zmiennych nazw plików dla dowolnej z funkcji include () lub obsługi plików.
PHP pozwala również na wywoływanie funkcji zmiennej poprzez dodanie () na końcu nazwy zmiennej - np.
$myvariable();
Wywoła nazwę funkcji określoną przez zmienną. Można to wykorzystać; np. jeśli osoba atakująca może uzyskać zmienną zawierającą słowo „eval” i może kontrolować parametr, może zrobić wszystko, co chce, nawet jeśli program tak naprawdę nie zawiera funkcji eval ().źródło
Te funkcje mogą mieć również nieprzyjemne efekty.
str_repeat()
unserialize()
register_tick_function()
register_shutdown_function()
Pierwsze dwa mogą wyczerpać całą dostępną pamięć, a drugie utrzymują wyczerpanie ...
źródło
Ostatnio dyskutowano o tym na security.stackexchange.com
Cóż, to nieco zmniejsza zakres - ale ponieważ „print” może być użyte do wstrzyknięcia javascript (a tym samym do kradzieży sesji itp.), Jest to nadal nieco arbitralne.
To rozsądne podejście.
Zastanów się jednak nad napisaniem własnego parsera - już wkrótce przekonasz się, że podejście oparte na grep wymyka się spod kontroli (awk byłoby trochę lepsze). Wkrótce zaczniesz też żałować, że nie zaimplementowałeś białej listy!
Oprócz oczywistych, polecam oflagowanie wszystkiego, co zawiera argument z argumentem czegoś innego niż literał łańcuchowy. Uważaj też na __autoload ().
źródło
Obawiam się, że moja odpowiedź może być zbyt negatywna, ale ...
IMHO, każdą dostępną funkcję i metodę można wykorzystać do niecnych celów. Potraktuj to jako efekt podstępu nieokreśloności: zmienna zostaje przypisana do użytkownika lub danych wejściowych, zmienna jest używana w funkcji, wartość zwracana przez funkcję używana we właściwości class, właściwość class używana w funkcji pliku, i tak dalej. Pamiętaj: podrobiony adres IP lub atak typu man-in-the-middle może wykorzystać całą witrynę.
Najprościej jest prześledzić od początku do końca ewentualnego użytkownika lub wejście zdalnego, począwszy od
$_SERVER
,$_GET
,$_POST
,$_FILE
,$_COOKIE
,include(some remote file)
( jeśliallow_url_fopen
jest włączony), wszystkie inne funkcje / klas zajmujące zdalnych plików, itd. Można programowo zbudować profil śledzenia stosu każdej wartości podanej przez użytkownika lub zdalnie. Można to zrobić programowo, uzyskując wszystkie powtarzające się wystąpienia przypisanej zmiennej i funkcji lub metod, w których jest używana, a następnie rekurencyjnie kompilując listę wszystkich wystąpień tych funkcji / metod itd. Sprawdź to, aby upewnić się, że najpierw przechodzi przez odpowiednie funkcje filtrowania i sprawdzania poprawności względem wszystkich innych funkcji, których dotyka. Jest to oczywiście badanie ręczne, w przeciwnym razie będziesz mieć ich całkowitą liczbęcase
przełączniki równe liczbie funkcji i metod w PHP (w tym zdefiniowane przez użytkownika).Alternatywnie do obsługi tylko danych wejściowych użytkownika, zainicjuj statyczną klasę kontrolera na początku wszystkich skryptów, co 1) sprawdza i przechowuje wszystkie wartości wejściowe dostarczone przez użytkownika na białej liście dozwolonych celów; 2) czyści to źródło wejściowe (tj
$_SERVER = null
.). Możesz zobaczyć, gdzie to robi się trochę nazistowskie.źródło
Oto lista funkcji, które mój dostawca wyłącza ze względów bezpieczeństwa:
źródło
Większość ataków w kodzie wykorzystuje wiele źródeł dostępu lub wiele kroków w celu ich wykonania. Szukałbym nie tylko kodu lub metody zawierającej złośliwy kod, ale wszystkich metod, funkcji wykonujących lub wywołujących ten kod. Najlepsze zabezpieczenia obejmowałyby także kodowanie i sprawdzanie poprawności danych formularzy podczas ich wchodzenia i wychodzenia.
Uważaj także na definiowanie zmiennych systemowych, mogą one zostać później wywołane z dowolnej funkcji lub metody w kodzie.
źródło
Wykryto kilka przepełnień bufora za pomocą 4-bitowych znaków interpretujących tekst. htmlentities () htmlspecialchars ()
były na górze, dobrą obroną jest użycie mb_convert_encoding () do konwersji na pojedyncze kodowanie przed interpretacją.
źródło
Ciągle aktualizowaną listę wrażliwych zlewów ( użyteczne funkcje php) i ich parametrów można znaleźć w RIPS /config/sinks.php, statycznym analizatorze kodu źródłowego pod kątem luk w aplikacjach PHP, który wykrywa również backdoory PHP.
źródło