Python-penetration-testing-application-layer

提供:Dev Guides
移動先:案内検索

アプリケーション層

WebアプリケーションとWebサーバーは、オンラインプレゼンスにとって重要であり、それらに対して観察される攻撃は、インターネットで試行された攻撃全体の70%以上を占めています。 これらの攻撃は、信頼できるWebサイトを悪意のあるWebサイトに変換しようとします。 このため、WebサーバーとWebアプリケーションのペンテストは重要な役割を果たします。

Webサーバーのフットプリント

Webサーバーの安全性を考慮する必要があるのはなぜですか? 電子商取引業界の急速な成長に伴い、攻撃者の主な標的はWebサーバーであるためです。 Webサーバーのペンテストでは、Webサーバー、そのホスティングソフトウェアとオペレーティングシステム、およびそれらで実行されているアプリケーションについて知る必要があります。 Webサーバーに関するこのような情報の収集は、Webサーバーのフットプリントと呼ばれます。

次のセクションでは、Webサーバーのフットプリントのさまざまな方法について説明します。

Webサーバーのフットプリントの方法

Webサーバーは、要求の処理と応答の処理専用のサーバーソフトウェアまたはハードウェアです。 これは、Webサーバーのペネトレーションテストを行う際に、ペンタスターが注力する重要な領域です。

次に、Pythonで実装されたいくつかのメソッドについて説明します。これらのメソッドは、Webサーバーのフットプリントのために実行できます-

HTTPメソッドの可用性のテスト

ペネトレーションテスターに​​とって非常に良いプラクティスは、利用可能なさまざまなHTTPメソッドをリストすることから始めることです。 以下は、ターゲットWebサーバーに接続し、使用可能なHTTPメソッドを列挙できるPythonスクリプトです。

まず、リクエストライブラリをインポートする必要があります-

import 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 Not Allowed 応答が返されます。そうでない場合は、「クロスサイトトレース(XST)が可能です」

HTTPヘッダーのチェックによるフットプリント

HTTPヘッダーは、Webサーバーからの要求と応答の両方にあります。 また、サーバーに関する非常に重要な情報も含まれています。 それが、ペネトレーションテスターが常にHTTPヘッダーを介した情報の解析に関心がある理由です。 以下は、Webサーバーのヘッダーに関する情報を取得するためのPythonスクリプトです-

まず、リクエストライブラリをインポートしましょう-

import requests

GET要求をWebサーバーに送信する必要があります。 次のコード行は、要求ライブラリを介して単純なGET要求を作成します。

request = requests.get('enter the URL')

次に、情報が必要なヘッダーのリストを生成します。

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

次はtry and 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フィールドの詳細については、リンク— link:/http/http_header_fields [https://www.finddevguides.com/http/http_header_fields]から学ぶこともできます。

安全でない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アプリケーションの侵入テストを行う際に焦点を当てるもう1つの重要な領域です。

次に、Pythonで実装されたさまざまなメソッドについて説明します。これらのメソッドは、Webアプリケーションのフットプリントに使用できます-

パーサーBeautifulSoupを使用して情報を収集する

Webページからすべてのハイパーリンクを収集するとします。 BeautifulSoupというパーサーを使用できます。 パーサーは、HTMLおよびXMLファイルからデータを引き出すためのPythonライブラリです。 スープオブジェクトを作成するために入力(ドキュメントまたはURL)が必要であり、Webページ自体を取得できないため、 urlib で使用できます。

まず、必要なパッケージをインポートしましょう。 urlibと BeautifulSoup をインポートします。 BeautifulSoupをインポートする前に、インストールする必要があります。

import urllib
from bs4 import BeautifulSoup

以下に示すPythonスクリプトは、Webページのタイトルとハイパーリンクを収集します-

ここで、WebサイトのURLを保存できる変数が必要です。 ここでは、「url」という名前の変数を使用します。 また、Webページを保存し、Webページを変数 html_page に割り当てることができる* page.read()*関数を使用します。

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
*html_page* は、スープオブジェクトを作成するための入力として割り当てられます。
soup_object = BeautifulSoup(html_page)

次の2行は、それぞれタグ付きおよびタグなしのタイトル名を出力します。

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スクリプトから取得したのと同様のヘッダーに関する情報を取得します。