instruktor: Porozmawiajmy o tym,
jak możemy teraz zapobiec tym lukom.
Po pierwsze, wiele z tych
luk istnieje ze względu na ich funkcjonalność.
Na przykład problem z przesyłaniem plików, który
mieliśmy, pozwala użytkownikowi przesłać dowolne rozszerzenie pliku, dowolny
typ pliku, to nie powinno się zdarzyć,
użytkownicy nie powinni mieć możliwości przesłania
dowolnych plików.
Może jeśli chcesz, aby przesłali zdjęcie,
upewnij się, że przesyłają zdjęcie,
sprawdź typy plików.
Jeśli oczekujesz, że prześlą piosenkę, plik MP #, upewnij się,
że jest to plik multimedialny, to nie jest
PHP ani kod wykonywalny.
Zwykle nigdy nie należy
zezwalać użytkownikom na przesyłanie plików wykonywalnych.
Filtrów można użyć do sprawdzenia, czy sprawdzić
rozszerzenie i upewnić
się, że przesyłany plik to JPEG lub cokolwiek innego.
Ale to
nie jest dobry sposób, najlepszym sposobem jest sprawdzenie
typu pliku i upewnienie się, że typ pliku to obraz
lub plik multimedialny, zamiast sprawdzania
rozszerzenia, ponieważ można to również pominąć.
Drugi rodzaj luk, na które
spojrzeliśmy, to luki w zabezpieczeniach podczas wykonywania kodu.
W tych exploitach byliśmy w stanie uruchomić dowolny kod
na komputerze docelowym.
Znowu tej funkcji należy unikać,
nie należy zezwalać użytkownikom na uruchamianie dowolnego rodzaju
kodu na serwerze.
Staraj się unikać tych
wszystkich funkcji, takich
jak var pass, oraz wszystkich tych funkcji,
które pozwalają użytkownikowi uruchamiać kod systemu operacyjnego na serwerze.
Jeśli absolutnie musiałeś użyć czegoś
takiego, upewnij się, że przeanalizowałeś dane wejściowe przed ich wykonaniem.
Na przykład w tym przykładzie widzieliśmy, gdzie kod
wykonywał polecenie ping i będzie ono pingować wszystko, co umieścimy
w polu tekstowym.
Więc umieszczam tutaj / $ textbox, aby pokazać, że to
jest dane wejściowe, które umieszczamy w polu tekstowym.
Tak właśnie wygląda program,
jeśli wydaje się zbyt skomplikowany. Zapomnij
o tym, mówimy tutaj o koncepcji.
Więc będziemy rozmawiać o tym tutaj.
Powiedzmy na przykład, że umieściłeś to,
co zrobiliśmy, to wstawiliśmy
normalny adres IP, a następnie umieściliśmy średnik, a następnie umieściliśmy
polecenie, które chcieliśmy zrobić, więc na przykład ls -la.
Problem polega na tym, że
aplikacja internetowa została tak przyjęta, skopiowana i uruchomiona tutaj.
Który sprawi, że po wykonaniu tego polecenia
najpierw wykona polecenie ping, a następnie wykona polecenie ls -la, które
jest poleceniem, którego chcieliśmy.
To, co musisz zrobić, to na przykład, jeśli musiałbyś
to zrobić, radzę, abyś po prostu nie używał tych funkcji.
Jeśli musisz użyć takiej funkcji, to powinieneś sprawdzić, czy
dane wejściowe są zgodne z oczekiwaniami, na przykład oczekujesz adresu IP
i nic
więcej, więc możesz użyć wyrażenia regularnego, aby
się upewnić, teraz ja Nie będę mówić o
wyrażeniu regularnym ani o tym, co to jest,
wyrażenie regularne jest w
zasadzie regułą, która upewni się,
że dane wejściowe będą wyglądały
w następującym formacie.
Tak więc potrzeba cyfry,
cyfry, kropki, cyfry, cyfry, kropki, cyfry, kropki, cyfry, cyfry,
które jeśli umieszczę cokolwiek innego,
to aplikacja internetowa powinna tego odmówić.
Możesz także upewnić się, że nie
ma średników i spacji, więc
wszystko pojawia się jako jedna rzecz, a
następnie zostaje wykonane.
Ponownie, jest to sposób na zwiększenie bezpieczeństwa, ale najlepszą
rzeczą jest po prostu uniknięcie tych funkcji.
Trzecim rodzajem podatności, na którą
spojrzeliśmy, było włączenie pliku i spojrzeliśmy
na dwa typy.
Lokalne dołączenie
pliku, które pozwoliło nam dołączyć dowolny plik
w systemie, a następnie
odczytać pliki, które spowodują lukę w ujawnieniu pliku, a
następnie będziesz mógł odczytać dowolny plik na
serwerze, a następnie spojrzeliśmy na zdalne
włączenie pliku, które jest
bardzo niebezpieczne, co pozwoliło nam dołączyć dowolny plik
z dowolnego serwera WWW, dzięki czemu mogliśmy dołączyć powłoki PHP,
a następnie uzyskać połączenie z komputera docelowego.
Aby temu zapobiec, przede
wszystkim upewnij się, że nie możesz włączyć zdalnego pliku.
Tak więc na wypadek, gdyby
coś poszło nie tak, ludzie nie mogą dołączać plików spoza
twojego serwera i możesz to zrobić
w taki sam
sposób, w jaki włączyliśmy to za pomocą
PHP ini, wyłączając allow_url_fopen i allow_url-include.
A jeśli przejdziemy tutaj do naszego
Metasploitable, pokażę wam bardzo
szybko, więc jeśli zrobimy sudo nano, czyli edytor tekstu / etc /
PHP / cgi / php. ini, ten sam plik,
którego użyliśmy,
jest to plik ustawień PHP.
Jeśli otworzysz ten
plik, a teraz zrobię Control
+ W i szukam allow_url.
I chcesz się upewnić, że parametr
allow_url_fopen jest ustawiony na
Off, a parametr allow_url_include jest również ustawiony na Off.
Control + X + Y i wprowadź, a
to zapisze dla Ciebie.
Innym sposobem uniknięcia
tych exploitów jest użycie statycznego dołączania plików,
więc zamiast dynamicznego dołączania plików, które
widzieliśmy, możesz na stałe zakodować pliki, które chcesz uwzględnić
w kodzie, i nie
uzyskać ich za pomocą GET lub POST.
Na przykład w przykładach, które widzimy w
przykładach luki w zabezpieczeniach, mamy stronę
o nazwie strona lub indeks. php.
A potem ten indeks. php pobiera parametr o nazwie strona, a
następnie pobiera inną stronę,
na przykład wiadomości. php.
I zawiera te wiadomości. php w kodzie.
Jak więc wygląda kod?
W kodzie PHP zobaczysz coś takiego.
Więc co to
właściwie zrobi, a to wygląda tak, jak sądzę,
co to robi, obejmuje
wszystko, co następuje po parametrze strony.
Tak więc kod dynamicznie pobiera wszystko, co pojawia się po parametrze
strony i dołącza go do bieżącej strony, aby znalazło
się w indeksie. strona php.
Okej, to
jest bardzo złe, ponieważ nawet jeśli
nie jest to GET,
czasem ludzie używają POST,
a w POST nie zobaczysz tego, więc zostanie opublikowany,
ale możesz użyć proxy, takiego
jak Burp proxy, a
to będzie wyglądać tak, a
następnie możesz go zmodyfikować i sprawić, by zawierał wszystko,
co chcesz, a następnie wyświetli się na stronie.
Naprawdę chcemy, aby użytkownik nie mógł manipulować tym, co
zostanie uwzględnione, więc jeśli chcesz dołączyć
stronę o nazwie aktualności. php, po prostu dołącz
to do tego, nie
dając użytkownikowi możliwości
zmiany.
Wiem, że
zaprogramujesz swój kod tak, aby wyglądał tak, ale użytkownicy,
wiemy, widzieliśmy, jak użytkownicy mogą się
tym bawić i po prostu
włączać to, co chcą.
Najlepszym sposobem, aby to zrobić,
jest włączenie strony. php,
więc twój kod nie używa żadnych zmiennych.
Jest mocno zakodowany, może wydłużyć twój kod, ale
jest o wiele bardziej bezpieczny.