Warstwa aplikacji
Aplikacje internetowe i serwery internetowe mają krytyczne znaczenie dla naszej obecności w Internecie, a obserwowane na nie ataki stanowią ponad 70% wszystkich ataków przeprowadzanych w Internecie. Te ataki próbują przekształcić zaufane witryny internetowe w złośliwe. Z tego powodu testowanie serwera WWW i aplikacji internetowych odgrywa ważną rolę.
Drukowanie foot serwera WWW
Dlaczego musimy wziąć pod uwagę bezpieczeństwo serwerów internetowych? Dzieje się tak, ponieważ wraz z szybkim rozwojem branży e-commerce głównym celem atakujących jest serwer WWW. Aby przeprowadzić pentestowanie serwera WWW, musimy wiedzieć o serwerze WWW, jego oprogramowaniu hostingowym i systemach operacyjnych oraz aplikacjach, które na nich działają. Zbieranie takich informacji o serwerze WWW nazywa się określaniem footprintów serwera WWW.
W naszej kolejnej sekcji omówimy różne metody tworzenia śladu serwera WWW.
Metody tworzenia footprintów serwera WWW
Serwery internetowe to oprogramowanie serwerowe lub sprzęt dedykowany do obsługi żądań i dostarczania odpowiedzi. Jest to kluczowy obszar, na którym pentester powinien się skupić podczas przeprowadzania testów penetracyjnych serwerów internetowych.
Omówmy teraz kilka metod zaimplementowanych w Pythonie, które można wykonać w celu określenia footprintów serwera WWW -
Testowanie dostępności metod HTTP
Bardzo dobrą praktyką dla testera penetracji jest rozpoczęcie od wyszczególnienia różnych dostępnych metod HTTP. Poniżej znajduje się skrypt w Pythonie, za pomocą którego możemy połączyć się z docelowym serwerem WWW i wyliczyć dostępne metody HTTP -
Na początek musimy zaimportować bibliotekę żądań -
import requests
Po zaimportowaniu biblioteki requestów stwórzmy tablicę metod HTTP, które mamy zamiar wysłać. Skorzystamy z niektórych standardowych metod, takich jak „GET”, „POST”, „PUT”, „DELETE”, „OPTIONS” i niestandardowej metody „TEST”, aby sprawdzić, jak serwer WWW może obsłużyć nieoczekiwane dane wejściowe.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
Poniższy wiersz kodu to główna pętla skryptu, która wyśle pakiety HTTP do serwera WWW i wydrukuje metodę oraz kod stanu.
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
W następnym wierszu zostanie sprawdzona możliwość śledzenia między lokacjami (XST), wysyłając metodę TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
Po uruchomieniu powyższego skryptu dla konkretnego serwera WWW, otrzymamy 200 odpowiedzi OK na konkretną metodę zaakceptowaną przez serwer WWW. Otrzymamy odpowiedź 403 Forbidden, jeśli serwer sieciowy wyraźnie odrzuci metodę. Gdy wyślemy metodę TRACE do testowania śledzenia między lokacjami (XST), otrzymamy405 Not Allowed odpowiedzi z serwera WWW, w przeciwnym razie otrzymamy wiadomość ‘Cross Site Tracing(XST) is possible’.
Drukowanie foot poprzez sprawdzenie nagłówków HTTP
Nagłówki HTTP znajdują się zarówno w żądaniach, jak i odpowiedziach z serwera WWW. Zawierają również bardzo ważne informacje o serwerach. Dlatego tester penetracji jest zawsze zainteresowany analizowaniem informacji za pomocą nagłówków HTTP. Poniżej znajduje się skrypt Pythona do uzyskiwania informacji o nagłówkach serwera WWW -
Na początek zaimportujmy bibliotekę żądań -
import requests
Musimy wysłać żądanie GET do serwera WWW. Poniższy wiersz kodu tworzy proste żądanie GET za pośrednictwem biblioteki żądań.
request = requests.get('enter the URL')
Następnie wygenerujemy listę nagłówków, o których potrzebujesz informacji.
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
Dalej jest próba i oprócz bloku.
for header in header_list:
try:
result = request.header_list[header]
print ('%s: %s' % (header, result))
except Exception as err:
print ('%s: No Details Found' % header)
Po uruchomieniu powyższego skryptu dla konkretnego serwera WWW, uzyskamy informację o nagłówkach znajdujących się na liście nagłówków. Jeśli nie będzie informacji dla konkretnego nagłówka, wyświetli się komunikat „Nie znaleziono szczegółów”. Możesz również dowiedzieć się więcej o polach HTTP_header z linku -https://www.tutorialspoint.com/http/http_header_fields.htm.
Testowanie niezabezpieczonych konfiguracji serwera WWW
Możemy użyć informacji nagłówka HTTP do przetestowania niezabezpieczonych konfiguracji serwera WWW. W poniższym skrypcie w Pythonie zamierzamy użyć bloku try / except do przetestowania niezabezpieczonych nagłówków serwera WWW pod kątem liczby adresów URL zapisanych w nazwie pliku tekstowegowebsites.txt -
import requests
urls = open("websites.txt", "r")
for url in urls:
url = url.strip()
req = requests.get(url)
print (url, 'report:')
try:
protection_xss = req.headers['X-XSS-Protection']
if protection_xss != '1; mode = block':
print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
except:
print ('X-XSS-Protection not set, it may be possible')
try:
options_content_type = req.headers['X-Content-Type-Options']
if options_content_type != 'nosniff':
print ('X-Content-Type-Options not set properly:', options_content_type)
except:
print ('X-Content-Type-Options not set')
try:
transport_security = req.headers['Strict-Transport-Security']
except:
print ('HSTS header not set properly, Man in the middle attacks is possible')
try:
content_security = req.headers['Content-Security-Policy']
print ('Content-Security-Policy set:', content_security)
except:
print ('Content-Security-Policy missing')
Ślad aplikacji internetowej
W naszej poprzedniej sekcji omawialiśmy footprinting serwera WWW. Podobnie, footprinting aplikacji internetowej jest również uważany za ważny z punktu widzenia testera penetracji.
W naszej kolejnej sekcji dowiemy się o różnych metodach tworzenia śladu aplikacji internetowej.
Metody umieszczania śladów aplikacji sieci Web
Aplikacja internetowa to program typu klient-serwer, który jest uruchamiany przez klienta na serwerze sieciowym. Jest to kolejny kluczowy obszar, na którym pentester powinien się skupić podczas przeprowadzania testów penetracyjnych aplikacji internetowych.
Omówmy teraz różne metody zaimplementowane w Pythonie, których można użyć do tworzenia footprintów aplikacji internetowej -
Zbieranie informacji przy użyciu parsera BeautifulSoup
Załóżmy, że chcemy zebrać wszystkie hiperłącza ze strony internetowej; możemy skorzystać z parsera o nazwie BeautifulSoup. Parser to biblioteka Pythona do wyciągania danych z plików HTML i XML. Może być używany zurlib ponieważ potrzebuje danych wejściowych (dokumentu lub adresu URL), aby utworzyć obiekt zupy i nie może samodzielnie pobrać strony internetowej.
Na początek zaimportujmy niezbędne pakiety. Zaimportujemy urlib iBeautifulSoup. Pamiętaj, że przed zaimportowaniem BeautifulSoup musimy go zainstalować.
import urllib
from bs4 import BeautifulSoup
Podany poniżej skrypt Pythona zbierze tytuł strony internetowej i hiperłącza -
Teraz potrzebujemy zmiennej, która może przechowywać adres URL witryny. Tutaj użyjemy zmiennej o nazwie „url”. Będziemy również używaćpage.read() funkcja, która może zapisać stronę internetową i przypisać ją do zmiennej html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
Plik html_page zostaną przypisane jako dane wejściowe do tworzenia obiektu zupy.
soup_object = BeautifulSoup(html_page)
Kolejne dwa wiersze spowodują wydrukowanie nazwy tytułu odpowiednio ze znacznikami i bez znaczników.
print soup_object.title
print soup_object.title.text
Linia kodu pokazana poniżej zapisze wszystkie hiperłącza.
for link in soup_object.find_all('a'):
print(link.get('href'))
Chwytanie banerów
Baner jest jak wiadomość tekstowa zawierająca informacje o serwerze, a przechwytywanie banera to proces pobierania informacji dostarczonych przez sam baner. Teraz musimy wiedzieć, jak generowany jest ten baner. Jest generowany przez nagłówek wysyłanego pakietu. Podczas gdy klient próbuje połączyć się z portem, serwer odpowiada, ponieważ nagłówek zawiera informacje o serwerze.
Poniższy skrypt w Pythonie pomaga złapać baner za pomocą programowania w gniazdach -
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))
def garb(s:)
try:
s.send('GET HTTP/1.1 \r\n')
ret = sock.recv(1024)
print ('[+]' + str(ret))
return
except Exception as error:
print ('[-]' Not information grabbed:' + str(error))
return
Po uruchomieniu powyższego skryptu otrzymamy podobne informacje o nagłówkach, jakie otrzymaliśmy ze skryptu w Pythonie footprinting nagłówków HTTP w poprzedniej sekcji.