应用层


Web 应用程序和 Web 服务器对于我们的在线存在至关重要,针对它们的攻击占互联网上尝试攻击总数的 70% 以上。这些攻击试图将受信任的网站转换为恶意网站。因此,Web 服务器和 Web 应用程序笔测试发挥着重要作用。

Web 服务器的足迹

为什么我们需要考虑网络服务器的安全性?这是因为随着电子商务行业的快速发展,攻击者的首要目标是Web服务器。对于 Web 服务器渗透测试,我们必须了解 Web 服务器、其托管软件和操作系统以及在其上运行的应用程序。收集有关 Web 服务器的此类信息称为 Web 服务器的足迹。

在接下来的部分中,我们将讨论 Web 服务器足迹的不同方法。

Web 服务器足迹的方法

Web 服务器是专用于处理请求和提供响应的服务器软件或硬件。这是渗透测试人员在进行 Web 服务器渗透测试时需要关注的一个关键领域。

现在让我们讨论一些用 Python 实现的方法,可以执行这些方法来跟踪 Web 服务器 -

测试 HTTP 方法的可用性

对于渗透测试人员来说,一个非常好的做法是首先列出各种可用的 HTTP 方法。以下是一个 Python 脚本,借助它我们可以连接到目标 Web 服务器并枚举可用的 HTTP 方法 -

首先,我们需要导入请求库 -

import requests

导入 requests 库后,创建一个我们将要发送的 HTTP 方法数组。我们将使用一些标准方法,如“GET”、“POST”、“PUT”、“DELETE”、“OPTIONS”和非标准方法“TEST”来检查 Web 服务器如何处理意外输入。

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

以下代码行是脚本的主循环,它将发送 HTTP 数据包到 Web 服务器并打印方法和状态代码。

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

下一行将通过发送 TRACE 方法来测试跨站点跟踪 (XST) 的可能性。

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

为特定 Web 服务器运行上述脚本后,我们将获得该 Web 服务器接受的特定方法的 200 OK 响应。如果 Web 服务器明确拒绝该方法,我们将收到 403 Forbidden 响应。一旦我们发送用于测试跨站点跟踪 (XST) 的 TRACE 方法,我们将收到来自 Web 服务器的405 不允许响应,否则我们将收到消息“跨站点跟踪 (XST) 是可能的”

通过检查 HTTP 标头进行足迹打印

HTTP 标头可在 Web 服务器的请求和响应中找到。它们还携带有关服务器的非常重要的信息。这就是渗透测试人员总是对通过 HTTP 标头解析信息感兴趣的原因。以下是一个用于获取有关 Web 服务器标头信息的 Python 脚本 -

首先,让我们导入请求库 -

import requests

我们需要向 Web 服务器发送 GET 请求。以下代码行通过 requests 库发出简单的 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)

针对特定的 Web 服务器运行上述脚本后,我们将获取有关标头列表中提供的标头的信息。如果没有特定标头的信息,则会显示消息“未找到详细信息”。您还可以通过链接了解有关 HTTP_header 字段的更多信息 — https://www.tutorialspoint.com/http/http_header_fields.htm

测试不安全的 Web 服务器配置

我们可以使用 HTTP 标头信息来测试不安全的 Web 服务器配置。在下面的 Python 脚本中,我们将使用 try/ except 块来测试不安全的 Web 服务器标头,以了解保存在文本文件名Websites.txt中的 URL 数量-

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')

Web 应用程序的足迹

在上一节中,我们讨论了 Web 服务器的足迹。同样,从渗透测试人员的角度来看,Web 应用程序的足迹也被认为很重要。

在接下来的部分中,我们将了解 Web 应用程序足迹的不同方法。

Web 应用程序足迹的方法

Web应用程序是一个客户端-服务器程序,由客户端在Web服务器上运行。这是渗透测试人员在进行 Web 应用程序渗透测试时需要关注的另一个关键领域。

现在让我们讨论用 Python 实现的不同方法,这些方法可用于 Web 应用程序的足迹 -

使用解析器 BeautifulSoup 收集信息

假设我们要收集一个网页的所有超链接;我们可以使用一个名为 BeautifulSoup 的解析器。该解析器是一个 Python 库,用于从 HTML 和 XML 文件中提取数据。它可以与urlib一起使用,因为它需要输入(文档或 url)来创建 soup 对象,并且它本身无法获取网页。

首先,让我们导入必要的包。我们将导入 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 对象的输入

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

运行上述脚本后,我们将获得与上一节中的 HTTP 标头足迹的 Python 脚本中获得的类似的标头信息。