web-dev-qa-db-ja.com

HTMLでトリガーされるGETメソッドでリファラーヘッダーを偽造する方法

DVWAのCSRFの脆弱性を調べています。次のコードを使用してrefererヘッダーがサーバー名と等しいかどうかを検証する中レベルに実行します。

if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) )

もしそうなら、私のクエリは受け入れられ、ログイン情報を変更するデータベースでトリガーされます。私は悪意のある webpage を通じてこれを行っています。

これまでのところ、サーバーからの応答ヘッダーで Referer name is を確認できました。私の理解から、そのphp関数は次のように求めています:

$ _ SERVER [‘SERVER_NAME’]の値は$ _SERVER [‘HTTP_REFERER’]に存在しますか?

それで、私の最初の考えは、リクエストURL文字列を操作して、そこにリファラーヘッダーを埋め込もうとすることでした。 (結果なし)ifステートメントがパターンを検索していると想定しています。問題は、それを渡す方法がわからず、正直に黙っているということです。GETリクエストが$_SERVER[ 'SERVER_NAME' ]にあるのか、$_SERVER[ 'HTTP_REFERER' ]にあるのかわかりません。私の調査から、リファラーヘッダーは単純なhtml imgタグでは変更できないと思います。したがって、私の最後の質問は次のようになります:ステートメントがtrueと評価される方法でimgタグの文字列(HTTPリクエストGET)を偽造できますか?そうでない場合、被害者が常にこの悪意のあるWebページを無意識に使用するシナリオで、どうすればよいですか?

3
fish202

とても簡単です!

ヒント:

このチェックは、要求元のURLに文字列localhostが含まれているかどうかを検証しますが、それがで始まっているかどうかは検証しません。では、どのようにしてリファラー(任意の場所)で文字列localhostを取得しますか?

ソリューション:

URLにターゲットホスト名を含むページからリクエストを送信する必要があります。

したがって、DVWAインスタンスがlocalhostでホストされている場合は、その文字列をURLに埋め込む必要があります。 http://evilhost/?localhostからCSRFリクエストを送信するだけです。これにより、次のようなリファラーヘッダーが生成されます。

リファラー: http:// evilhost /?localhost

それはチェックに合格するのに十分です。

5
Arminius