Уровень приложения

Веб-приложения и веб-серверы имеют решающее значение для нашего присутствия в Интернете, и наблюдаемые против них атаки составляют более 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 Forbidden, если веб-сервер явно отклонит метод. Как только мы отправим метод TRACE для тестирования межсайтовой трассировки (XST), мы получим405 Not Allowed ответы от веб-сервера, иначе мы получим сообщение ‘Cross Site Tracing(XST) is possible’.

Печать стоп с проверкой заголовков 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’]

Далее следует блок try и except.

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 / except для проверки небезопасных заголовков веб-сервера для количества URL-адресов, сохраненных в имени текстового файла.websites.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-заголовков в предыдущем разделе.