Python-penetration-testing-application-layer
アプリケーション層
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スクリプトから取得したのと同様のヘッダーに関する情報を取得します。