應用層



Web應用程式和Web伺服器對於我們的線上存在至關重要,針對它們的攻擊佔網際網路上所有攻擊嘗試的70%以上。這些攻擊試圖將可信網站轉換為惡意網站。由於這個原因,Web伺服器和Web應用程式滲透測試發揮著重要的作用。

Web伺服器的足跡收集

為什麼我們需要考慮Web伺服器的安全?這是因為隨著電子商務行業的快速發展,攻擊者的主要目標是Web伺服器。對於Web伺服器滲透測試,我們必須瞭解Web伺服器、其託管軟體和作業系統以及在其上執行的應用程式。收集關於Web伺服器的此類資訊稱為Web伺服器的足跡收集。

在接下來的章節中,我們將討論Web伺服器足跡收集的不同方法。

Web伺服器足跡收集的方法

Web伺服器是專門用於處理請求和提供響應的伺服器軟體或硬體。在進行Web伺服器滲透測試時,這是滲透測試人員需要關注的關鍵領域。

現在讓我們討論一些在Python中實現的方法,這些方法可以用於執行Web伺服器的足跡收集 -

測試HTTP方法的可用性

滲透測試人員的一個非常好的實踐是從列出各種可用的HTTP方法開始。下面是一個Python指令碼,藉助它我們可以連線到目標Web伺服器並列舉可用的HTTP方法 -

首先,我們需要匯入requests庫 -

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響應。一旦我們傳送TRACE方法來測試跨站點跟蹤(XST),我們將從Web伺服器獲得405 Not Allowed響應,否則我們將獲得訊息'跨站點跟蹤(XST)是可能的'

透過檢查HTTP標頭進行足跡收集

HTTP標頭存在於Web伺服器的請求和響應中。它們還承載關於伺服器的非常重要的資訊。這就是為什麼滲透測試人員總是對透過HTTP標頭解析資訊感興趣。以下是一個用於獲取Web伺服器標頭資訊的Python指令碼 -

首先,讓我們匯入requests庫 -

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://tutorialspoint.tw/http/http_header_fields.htm

測試不安全的Web伺服器配置

我們可以使用HTTP標頭資訊來測試不安全的Web伺服器配置。在下面的Python指令碼中,我們將使用try/except塊來測試儲存在名為websites.txt的文字檔案中的多個URL的不安全的Web伺服器標頭 -

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

執行上述指令碼後,我們將獲得與上一節中Web伺服器HTTP標頭足跡收集的Python指令碼獲得的標頭資訊類似的資訊。

廣告