Учебники

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

Веб-приложения и веб-серверы имеют решающее значение для нашего присутствия в сети, и атаки, совершаемые против них, составляют более 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 в предыдущем разделе.