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ページを無意識に使用するシナリオで、どうすればよいですか?
とても簡単です!
ヒント:
このチェックは、要求元のURLに文字列
localhost
が含まれているかどうかを検証しますが、それがで始まっているかどうかは検証しません。では、どのようにしてリファラー(任意の場所)で文字列localhost
を取得しますか?
ソリューション:
URLにターゲットホスト名を含むページからリクエストを送信する必要があります。
したがって、DVWAインスタンスが
localhost
でホストされている場合は、その文字列をURLに埋め込む必要があります。http://evilhost/?localhost
からCSRFリクエストを送信するだけです。これにより、次のようなリファラーヘッダーが生成されます。リファラー: http:// evilhost /?localhostそれはチェックに合格するのに十分です。