Веб-приложения и веб-серверы имеют решающее значение для нашего присутствия в сети, и атаки, совершаемые против них, составляют более 70% от общего числа попыток атак в Интернете. Эти атаки пытаются превратить доверенные сайты в вредоносные. По этой причине тестирование веб-сервера и пера веб-приложения играет важную роль.
Печать ног веб-сервера
Почему мы должны учитывать безопасность веб-серверов? Это происходит потому, что с быстрым ростом индустрии электронной коммерции основной целью злоумышленников является веб-сервер. Для тестирования веб-сервера мы должны знать о веб-сервере, его программном обеспечении и операционных системах, а также о приложениях, которые на них работают. Сбор такой информации о веб-сервере называется следом веб-сервера.
В нашем следующем разделе мы обсудим различные методы следования веб-сервера.
Методы следования веб-сервера
Веб-серверы — это серверное программное или аппаратное обеспечение, предназначенное для обработки запросов и обслуживания ответов. Это ключевая область для пентестера, на которой следует сосредоточиться во время тестирования на проникновение веб-серверов.
Давайте теперь обсудим несколько методов, реализованных в Python, которые могут быть выполнены для создания отпечатка веб-сервера —
Проверка доступности HTTP-методов
Очень хорошая практика для тестера на проникновение — начать с перечисления различных доступных методов HTTP. Ниже приведен скрипт Python, с помощью которого мы можем подключиться к целевому веб-серверу и перечислить доступные методы HTTP —
Для начала нам нужно импортировать библиотеку запросов —
import requests
После импорта библиотеки запросов создайте массив методов HTTP, которые мы собираемся отправить. Мы будем использовать некоторые стандартные методы, такие как «GET», «POST», «PUT», «DELETE», «OPTIONS» и нестандартный метод «TEST», чтобы проверить, как веб-сервер может обрабатывать неожиданный ввод.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
Следующая строка кода представляет собой основной цикл сценария, который отправляет HTTP-пакеты на веб-сервер и печатает метод и код состояния.
for method in method_list: req = requests.request(method, 'Enter the URL’) print (method, req.status_code, req.reason)
Следующая строка будет проверять возможность межсайтовой трассировки (XST), отправляя метод TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text: print ('Cross Site Tracing(XST) is possible')
После запуска вышеуказанного сценария для определенного веб-сервера мы получим 200 ответов OK для определенного метода, принятого веб-сервером. Мы получим 403 Запрещенный ответ, если веб-сервер явно отрицает метод. После того, как мы отправим метод TRACE для тестирования межсайтовой трассировки (XST), мы получим 405 не разрешенных ответов от веб-сервера, в противном случае мы получим сообщение «Возможна межсайтовая трассировка (XST)» .
Печать стопы путем проверки заголовков HTTP
Заголовки HTTP находятся как в запросах, так и в ответах с веб-сервера. Они также несут очень важную информацию о серверах. Вот почему тестер проникновения всегда заинтересован в анализе информации через заголовки HTTP. Ниже приведен скрипт на Python для получения информации о заголовках веб-сервера:
Для начала давайте импортируем библиотеку запросов —
import requests
Нам нужно отправить запрос GET на веб-сервер. Следующая строка кода делает простой запрос GET через библиотеку запросов.
request = requests.get('enter the URL')
Далее мы сгенерируем список заголовков, по которым вам нужна информация.
header_list = [ 'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
Далее идет попытка, кроме блока.
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)
После запуска приведенного выше сценария для определенного веб-сервера мы получим информацию о заголовках, представленных в списке заголовков. Если для определенного заголовка не будет никакой информации, он выдаст сообщение «Детали не найдены». Вы также можете узнать больше о полях HTTP_header по ссылке — https://www.tutorialspoint.com/http/http_header_fields.htm .
Тестирование небезопасных конфигураций веб-сервера
Мы можем использовать информацию заголовка HTTP для тестирования небезопасных конфигураций веб-сервера. В следующем скрипте Python мы будем использовать блок try / Кроме того, чтобы протестировать небезопасные заголовки веб-сервера на количество URL-адресов, которые сохраняются в текстовом файле с именем website.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')
Эскиз веб-приложения
В нашем предыдущем разделе мы обсуждали следы веб-сервера. Аналогичным образом, отпечаток веб-приложения также считается важным с точки зрения тестера на проникновение.
В нашем следующем разделе мы узнаем о различных методах создания отпечатков веб-приложений.
Методы создания отпечатков веб-приложений
Веб-приложение — это клиент-серверная программа, которая запускается клиентом на веб-сервере. Это еще одна ключевая область, на которой пентестер должен сосредоточиться, проводя тестирование веб-приложения на проникновение.
Давайте теперь обсудим различные методы, реализованные в Python, которые можно использовать для создания отпечатков веб-приложений.
Сбор информации с помощью парсера BeautifulSoup
Предположим, мы хотим собрать все гиперссылки с веб-страницы; мы можем использовать парсер BeautifulSoup. Парсер — это библиотека Python для извлечения данных из файлов HTML и XML. Его можно использовать с urlib, потому что ему нужен ввод (документ или URL) для создания объекта-супа, и он не может сам получить веб-страницу.
Для начала давайте импортируем необходимые пакеты. Мы будем импортировать urlib и BeautifulSoup . Помните, что перед импортом BeautifulSoup нам нужно установить его.
import urllib from bs4 import BeautifulSoup
Скрипт Python, приведенный ниже, соберет заголовок веб-страницы и гиперссылки —
Теперь нам нужна переменная, которая может хранить URL сайта. Здесь мы будем использовать переменную с именем ‘url’. Мы также будем использовать функцию page.read (), которая может хранить веб-страницу и назначать веб-страницу переменной html_page .
url = raw_input("Enter the URL ") page = urllib.urlopen(url) html_page = page.read()
Html_page будет назначен как вход для создания супового объекта.
soup_object = BeautifulSoup(html_page)
Следующие две строки напечатают название заголовка с тегами и без тегов соответственно.
print soup_object.title print soup_object.title.text
Строка кода, показанная ниже, сохранит все гиперссылки.
for link in soup_object.find_all('a'): print(link.get('href'))
Захват баннера
Баннер подобен текстовому сообщению, которое содержит информацию о сервере, а захват баннера — это процесс извлечения информации, предоставленной самим баннером. Теперь нам нужно знать, как генерируется этот баннер. Он генерируется заголовком отправляемого пакета. И хотя клиент пытается подключиться к порту, сервер отвечает, потому что заголовок содержит информацию о сервере.
Следующий скрипт Python помогает захватить баннер с помощью сокет программирования —
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
После запуска вышеприведенного скрипта мы получим информацию о заголовках, аналогичную той, которую мы получили из скрипта Python, содержащего следы заголовков HTTP в предыдущем разделе.