はじめに
Web アプリケーションセキュリティにおいて、隠されたり文書化されていない GET パラメータを発見することは、潜在的な脆弱性を特定するために不可欠です。これらのパラメータは、アプリケーションによって適切に処理されない場合、情報漏洩、SQL インジェクション、その他のセキュリティ上の欠陥につながることがあります。人気のディレクトリおよびファイルブルートフォースツールである Gobuster は、「fuzz」モードも提供しており、GET パラメータの発見に活用できます。
この実験では、Gobuster の fuzz モードを使用して GET パラメータを特定するプロセスを説明します。FUZZキーワードを含む URL の構築方法、一般的なパラメータ名の単語リストの使用、スキャンの実行、および興味深いパラメータを見つけるための結果の分析方法を学びます。この実験の終わりまでに、Gobuster を使用した GET パラメータファジングの実行方法について実践的な理解を得ることができ、これはサイバーセキュリティ愛好家や専門家にとって価値のあるスキルとなります。
テスト対象の URL エンドポイントを特定する
このステップでは、隠された GET パラメータをテストしたいターゲット URL エンドポイントを特定します。この実験では、脆弱なアプリケーションをシミュレートするシンプルな Web サーバーを使用します。基本的な HTML ファイルを配信するために Python HTTP サーバーを起動します。
まず、プロジェクトディレクトリに移動します。
cd ~/project
次に、ターゲットとして使用するindex.htmlという名前のシンプルな HTML ファイルを作成します。このファイルは、GET パラメータを受け入れる可能性のある Web ページをシミュレートします。
nano index.html
index.htmlに以下の内容を追加します。
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Welcome to the Test Page!</h1>
<p>This page is for testing GET parameters.</p>
</body>
</html>
Ctrl+X、Y、Enterを押してファイルを保存します。
次に、このファイルを配信するためのシンプルな Python HTTP サーバーを起動します。このサーバーはポート8000で実行されます。
python3 -m http.server 8000 &
末尾の&はサーバーをバックグラウンドで実行し、ターミナルを使い続けることができます。以下のような出力が表示されるはずです。
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
ファジングのターゲット URL エンドポイントはhttp://127.0.0.1:8000/index.htmlになります。
パラメータ名として FUZZ キーワードを含む URL を構築する
このステップでは、Gobuster がファジングに使用する URL の構築方法を学びます。Gobuster の fuzz モードでは、単語リストのエントリを挿入する場所を示すために、URL にFUZZキーワードが必要です。GET パラメータのファジングでは、FUZZキーワードがパラメータ名を置き換えます。
パラメータを持つ GET リクエストの基本的な形式はhttp://example.com/path?parameter=valueです。パラメータ名をファジングするために、parameterをFUZZに置き換えます。値は、パラメータ名自体の発見のみに興味があるため、何でも構いません。一般的な慣習として、1やtestのような簡単な値を使用します。
この実験では、ターゲット URL はhttp://127.0.0.1:8000/index.htmlです。GET パラメータ名をファジングするために、URL は次のように構築されます。
http://127.0.0.1:8000/index.html?FUZZ=test
ここで:
http://127.0.0.1:8000/index.htmlはベース URL です。?はクエリ文字列の開始を示します。FUZZは、Gobuster が単語リストから単語を挿入するプレースホルダーです。=testはパラメータの静的な値です。パラメータ名の発見においては特定の値は重要ではありませんが、有効なパラメータ形式には必要です。
このステップではコマンドを実行する必要はありませんが、次のステップのためにこの URL 構築を理解することが重要です。
一般的なパラメータ名を含む単語リストを使用する
このステップでは、一般的な GET パラメータ名を含む単語リストを準備します。Gobuster は、この単語リストを反復処理し、URL 内のFUZZキーワードをリストの各単語で置き換えます。
Gobuster にはデフォルトの単語リストが付属していることが多いですが、独自の単語リストを作成または指定する方法を知っておくことは良い習慣です。この実験では、いくつかの一般的なパラメータ名を含む小さなカスタム単語リストを作成します。
まず、~/projectディレクトリにいることを確認します。
cd ~/project
次に、単語リストとして機能するparams.txtという名前の新しいファイルを作成します。
nano params.txt
params.txtに、各行に 1 つずつ、以下の一般的なパラメータ名を追加します。
id
name
user
page
search
query
file
data
token
Ctrl+X、Y、Enterを押してファイルを保存します。
このparams.txtファイルは、次のステップで Gobuster が GET パラメータをファジングするために使用されます。
gobuster fuzz スキャンの実行
このステップでは、構築した URL と単語リストを使用して Gobuster の fuzz スキャンを実行します。
Gobuster の fuzz モードのコマンドはgobuster fuzzです。-uフラグでFUZZキーワードを含む URL を、-wフラグで単語リストを指定する必要があります。
ターミナルを開き、以下のコマンドを実行します。
gobuster fuzz -u http://127.0.0.1:8000/index.html?FUZZ=test -w ~/project/params.txt
コマンドの内訳を見てみましょう。
gobuster fuzz: Gobuster をファジングモードで起動します。-u http://127.0.0.1:8000/index.html?FUZZ=test:FUZZプレースホルダーを含むターゲット URL を指定します。-w ~/project/params.txt: パラメータ名を含む単語リストへのパスを指定します。
Gobuster は、params.txtの各単語でFUZZを置き換えて、Web サーバーにリクエストを送信します。このindex.htmlは実際にはこれらのパラメータを処理しないため、Gobuster はすべてのアクエストで同じステータスコードとコンテンツ長を報告する可能性が高いです。しかし、実際のシナリオでは、ステータスコードまたはコンテンツ長の変更は、パラメータが認識されている可能性を示唆します。
出力には、各試行とその対応するステータスコードおよびコンテンツ長が表示されます。以下のような表示になります。
===============================================================
Gobuster vX.X.X
===============================================================
[+] Url: http://127.0.0.1:8000/index.html?FUZZ=test
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /home/labex/project/params.txt
[+] Status codes: 200,204,301,302,307,401,403,405
[+] User Agent: gobuster/X.X.X
[+] Timeout: 10s
===============================================================
200 (290) - http://127.0.0.1:8000/index.html?id=test
200 (290) - http://127.0.0.1:8000/index.html?name=test
200 (290) - http://127.0.0.1:8000/index.html?user=test
200 (290) - http://127.0.0.1:8000/index.html?page=test
200 (290) - http://127.0.0.1:8000/index.html?search=test
200 (290) - http://127.0.0.1:8000/index.html?query=test
200 (290) - http://127.0.0.1:8000/index.html?file=test
200 (290) - http://127.0.0.1:8000/index.html?data=test
200 (290) - http://127.0.0.1:8000/index.html?token=test
===============================================================
レスポンス長またはステータスの変更に対する結果の分析
このステップでは、Gobuster の fuzz スキャンの出力を解釈する方法を学びます。潜在的に有効または興味深い GET パラメータを特定する鍵は、HTTP レスポンスの変更を観察することにあります。
Gobuster を実行すると、リクエストごとに HTTP ステータスコードとコンテンツ長(バイト単位)が表示されます。
たとえば、前のステップの出力は次のようになります。
200 (290) - http://127.0.0.1:8000/index.html?id=test
200 (290) - http://127.0.0.1:8000/index.html?name=test
...
ここで、200は HTTP ステータスコード(OK)、290はレスポンスのコンテンツ長です。
注目すべき点:
- 異なるステータスコード: 特定のパラメータ名を持つリクエストが異なる HTTP ステータスコード(例:有効な場合は
200、見つからない場合は404、サーバーエラーの場合は500、リダイレクトの場合は302)を返す場合、アプリケーションがそのパラメータを処理したか、またはそれに反応したことを示している可能性があります。例えば、通常404 Not Foundを返すパラメータに対して200 OKが得られた場合、それは重要である可能性があります。 - 異なるコンテンツ長: ステータスコードが
200 OKのままであっても、コンテンツ長の変更は強力な指標となり得ます。これは多くの場合、アプリケーションのレスポンスボディが変更されたことを意味し、おそらくパラメータに関連する特定のデータ、エラーメッセージ、または異なるページレイアウトが含まれています。 - エラーメッセージ: 時には、パラメータがエラーメッセージ(例:SQL エラー、アプリケーションエラー)を引き起こし、それがレスポンスボディに反映され、異なるコンテンツ長や
500ステータスコードにつながることがあります。これは潜在的な脆弱性の強力な兆候です。
現在の実験環境では、index.htmlは静的ファイルであり、Python サーバーは GET パラメータを処理しないため、すべてのアクエストが200ステータスコードと同一のコンテンツ長(290バイト)を返すことが観察されるでしょう。これは、私たちの単純なテストケースでは予期される動作です。
実際のシナリオでは、ライブの Web アプリケーションをファジングしていて、以下のようなエントリを見た場合:
200 (512) - http://example.com/search?query=test
他のパラメータが200 (290)を返している一方で、queryパラメータはコンテンツ長が異なるため、さらに調査する価値があります。
これで実験は終了です。Gobuster を使用して GET パラメータをファジングする方法と、その結果を分析する方法を習得しました。
Python HTTP サーバーを停止するには、そのプロセス ID(PID)を見つけて終了させる必要があります。まず、実行中の Python プロセスを一覧表示します。
ps aux | grep "python3 -m http.server 8000"
以下のような出力が表示されるでしょう。
labex 1234 0.0 0.0 12345 6789 ? S HH:MM 0:00 python3 -m http.server 8000
PID(この例では1234など)をメモし、次にプロセスを終了させます。
kill 1234
1234は、実際に見つけた PID に置き換えてください。
まとめ
この実験では、Gobuster を使用して GET パラメータのファジングを実行する方法を学びました。まず、ローカル Web サーバーをセットアップし、ターゲットとなる HTML ファイルを作成しました。次に、FUZZキーワードを含む URL を構築し、一般的なパラメータ名のカスタム単語リストを準備し、Gobuster の fuzz スキャンを実行しました。最後に、スキャン結果を分析する方法を学び、認識されたパラメータの重要な指標である HTTP ステータスコードとコンテンツ長の変更に焦点を当てました。
このテクニックは、Web アプリケーションの偵察の基本的な部分であり、隠された機能や潜在的な脆弱性を明らかにするのに役立ちます。このスキルを習得することで、Web アプリケーションの攻撃対象領域を特定し、調査する能力が向上します。
