web-dev-qa-db-ja.com

このSQLインジェクションの脆弱性を悪用する方法?

脆弱なWebアプリでSQLインジェクションを学習しています。 w3afでスキャンしました。多くの脆弱性が見られました。それらの1つは次のとおりです。

Microsoft SQLデータベースでのSQLインジェクションは、HTTPメソッドPOSTを使用して「 http://www.example.com/Login.aspx?CurrentPage=Login 」で見つかりました。送信されたポストデータは、「... ctl00 $ cphMain $ txtUserName = d'z "0 ...」でした。

これをどのように利用しますか?実際に悪用してアクセスを許可するURLは何ですか?誰かがこれで私を助けることができますか?

2
narayan

通常、ログインを悪用するときは、パスワードフィールドが検証されないようにするために何かを注入したいでしょう。これは通常、次のような構文をパスワードとして入力することで実現できます。

myphonypassword' OR 1=1;--

これは、OR 1 = 1により、クエリは常に真です。

このエクスプロイトを機能させるために試行する必要があるさまざまなネットのバリエーションがあります(特にブラインドSQLエクスプロイトの場合)。この例では、さらに多くの例を見ることができます SQLインジェクションチートシート 特にログインバイパス用。

特定の例では、おそらくtxtPassWordと呼ばれるフィールドを編集する必要がありますが、あなたが提供した少しの詳細では不明瞭です。

編集:これは投稿のみのパラメーターであるため、URLのみを介して攻撃することはできません。プロキシを使用してリクエストをインターセプトし、その方法で投稿パラメータを変更するか、他の回答の提案のようにCurlを使用して新しいリクエストを作成できます。

5
Chris Dale

POSTをURLに作成する必要があります_http://www.example.com/Login.aspx?CurrentPage=Login_。エクスプロイトは、POSTの本文で送信されたデータにあります。たとえば、_...ctl00$cphMain$txtUserName=d'z"0..._と_'_は、txtUserNameが攻撃対象のフィールドのように見えるようにします。フィールドを分離する標準的な方法は、_&_文字を使用することですが、投稿したフラグメントは、_$_のように見えますセパレータとして使用されます。

コマンドラインからcurlを使用する場合は、次のようなコマンドを実行できます(シェルがそれを食べないようにするために、埋め込まれた_\_の_'_エスケープに注意してください)。

_curl -d 'ctl00$cphMain$txtUserName=d\'z"0' http://www.example.com/Login.aspx?CurrentPage=Login
_

攻撃する特定のアプリケーションに合わせて、txtUserNameの値を調整する必要があります。

3
bstpierre

通常、ログインページでは、最初にヘッダーをトレースして、実際のログインフォームフィールド、つまり投稿フォーム変数を見つけます。次に、POSTではなくGETを使用してサーバーにデータを送信できるかどうかを確認します。たとえば、フォームが4つの変数、$ username、$ password、$ xの場合、リクエストを次のように設定します。

/Login.aspx?CurrentPage=Login&username=name&password=pass&x=1

サーバーから間違ったユーザー/パスワード応答を受け取ったかどうかを確認します。その場合、GETを使用してPOSTメソッドを使用するよりも、注入ベクトルを見つける方がはるかに簡単です。

それが許可されている場合は、次のようなデータベース応答をトリガーしようとすることができます

/Login.aspx?CurrentPage=Login&username=name'[enter your SQL statement here]&password=pass&x=1

POSTメソッドが許可される唯一のメソッドである場合、データを送信するために「URL」を使用することはできませんが、むしろbstpierreが述べたことから続くので、 FirefoxのライブHTTPヘッダーなどのブラウザーアドオンの1つを使用するフォーム送信者、または独自のサーバーでフォームを再構築して、テストしているサイトに送信します。

2
Taipo