应用层

Web 应用程序和 Web 服务器对于我们的在线状态至关重要,针对它们的攻击占互联网上所有攻击的 70% 以上。这些攻击试图将受信任的网站转变为恶意网站。因此,Web 服务器和 Web 应用程序渗透测试起着重要作用。

Web 服务器的足迹

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

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

Web 服务器足迹的方法

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

现在让我们讨论一些用 Python 实现的方法,这些方法可用于对 Web 服务器进行足迹 −

测试 HTTP 方法的可用性

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

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

import request

导入请求库后,创建一个 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 响应。一旦我们发送 TRACE 方法以测试跨站点跟踪 (XST),我们将从 Web 服务器获得 405 Not Allowed 响应,否则我们将收到消息 "跨站点跟踪 (XST) 是可能的"

通过检查 HTTP 标头进行足迹

HTTP 标头存在于 Web 服务器的请求和响应中。它们还包含有关服务器的非常重要的信息。这就是渗透测试人员始终对通过 HTTP 标头解析信息感兴趣的原因。以下是获取有关 Web 服务器标头信息的 Python 脚本 −

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

import request

我们需要向 Web 服务器发送 GET 请求。以下代码行通过请求库发出一个简单的 GET 请求。

request = request.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("输入 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 
')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

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