来一题 cisp-pte 中的ファイルアップロードの問題で、アップロードファイルのパスを推測するためにブルートフォース攻撃を行う必要があります。
問題を開くと、以下の画面が表示されます。
ファイルアップロードの部分のコードが示されています。
$filename = $files["name"];
$randnum = rand(1, 99999);
$fullpath = '/' . md5($filename.$randnum).".".substr($filename,strripos($filename,'.') + 1);
コードからわかるように、アップロードされたファイル名は md5 で暗号化され、暗号化方法は現在のアップロードされたファイル名に 1 から 99999 のランダムな数値を追加し、その後に。とファイルの拡張子が続きます。
ファイルをアップロードしてみましょう。アップロードされたファイルは eval などのキーワードをフィルタリングしますが、大文字を使用することで回避できます。また、content-type を画像形式に変更する必要があります。
アップロードが成功した後、アップロード後のパスを表示することができません。
アップロードされたコードに基づいて、まず画像をアップロードし、アップロードされた画像を md5 で暗号化します。md5 (1.php1).php となります。画像をアップロードした後、アップロードされたファイルのパスがわからないため、アップロード後のファイル名を推測する必要があります。推測には md5 (1.php1).php の方法が使用されます。
以下は具体的な手順です:
-
パケットを intruder に配置し、x-forwarded-for パラメータに 127.0.0.1 を設定し、パラメータ 1 を遍歴します。
- 次に、ペイロードオプションを設定します。
Payload type: Numbers
From: 1
To: 200
Step: 1
1 から 99999 の範囲で 1 から 200 を遍歴します。
さらに、2 つの値を設定する必要があります。ペイロード処理では、各値を遍歴する際に、1.php の接頭辞を追加し、その内容(1.php [1-200])を md5 で暗号化します。
-
アップロードが成功すると、サイズと長さが同じになります。この時点ではアップロード後のファイル名がわかりません。なぜなら、1.php [1-200] の md5 値は同じだからです。したがって、もう一度ブルートフォース攻撃を行い、この場合は直接ファイル名をリクエストします。/md5 (1.php [1-200]) とします。アクセスできるものが正しいファイル名です。
-
アップロード後のファイル名を推測し、md5 で暗号化された内容に直接アクセスします。
ペイロードの設定はファイルのアップロードと同じです。
200 のステータスコードで区別することで、アップロードされたファイル名は以下の図に示すようになります。
アップロードが成功したら、蚁剣を使用して接続します。
追記:2023-07-21
上記の方法では、ファイルのアップロード部分が少し冗長です。ここでは、この手順を簡略化する方法を示します。
- パケットキャプチャ
ペイロードを設定し、パケットを送信するだけで、他のペイロードを設定する必要はありません。null ペイロードは、リクエストを繰り返し送信することを意味します。
- その後、パスをブルートフォース攻撃します。
任意のパスをリクエストし、.php を残します。
ペイロードの設定は以下の通りです:
2000 個のペイロードで複数のファイルをアップロードできます。