web-dev-qa-db-ja.com

入力フィールドのあるサイトでSQLインジェクションの脆弱性をテストするにはどうすればよいですか?

SQLインジェクションの脆弱性をテストするためにどのような方法が利用できますか?

48
John S

SQLインジェクションなど、アプリケーションの脆弱性をテストする方法はいくつかあります。テストは3つの異なる方法論に分類されます。

ブラインドインジェクション

MySQLの例:

http://localhost/test.php?id=sleep(30)

このSQLステートメントがデータベースによって解釈される場合、ページのロードには30秒かかります。

エラーメッセージ:

http://localhost/test.php?id='"

エラー報告がenabledであり、このリクエストがSQLインジェクションに対して脆弱である場合、次のエラーが生成されます。

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、5行目の「 "」付近で使用する正しい構文を確認してください。

Tautology Based Injection

http://localhost/test.php?username=' or 1=1 /*&password=1

この場合、 Tautology を指定するか、常に真であるステートメントを使用すると、予測可能な結果が得られます。この場合、予測可能な結果は、データベース内の最初のユーザー(通常は管理者)で攻撃者にログインすることです。

上記のメソッドの使用を自動化して、WebアプリケーションのSQLインジェクションを検出するツールがあります。これを行う WapitiSkipfish などの無料のオープンソースツールがあります。 Sitewatch は、これらのオープンソースツールよりもはるかに優れた無料サービスを提供します。私はSitewatchの開発者なので、私はそれを言うことができます。

52
rook

SQLインジェクションについてサイトをテストしないことが最善です。 SQLインジェクションの可能性を回避するのが最善です。ユーザー入力があるときに自分で文字列処理を行ってSQLクエリを作成しないでください。すべてのクエリで bound parameters を使用します(有害な方法で使用され、クエリに適切な制限を課す可能性がある場合は、すべてのユーザーデータをサニタイズします)。つまり、クエリsql_execute("select user from user_db where id="+input_id)は安全ではありません(その_input_id = "1 OR 1==1 --"_かどうかを想像してください)。ただし、_stored_procedure = "select user from user_db where id = ? LIMIT 1;"_、sql_execute_with_param(stored_procedure, input_id);は安全です。

明らかに、これはあなたがあなた自身のサイトを安全にしようとしている場合のみです。他のアプリケーションの欠陥を見つけようとしている場合、別の話であり、FAQに対してこのサイトはブラックハットではないことを示している可能性があります。しかし、OWASPのテストに関する非常に優れた記事があります- SQLインジェクション

13
dr jimbob

ゼロから始める場合は、次のいずれかをお勧めします。

  1. 彼らがしていることを知っている誰かを雇う
  2. 最初のストップギャップとして自動化ツールを採用します。一部のオプションには、Burp Pro、ZAP、およびSQLマップが含まれます。

ただし、奇妙で潜在的に危険な入力をWebアプリケーションに送信すると、アプリケーションの整合性が損なわれる可能性が非常に高いことに注意してください。

Webアプリを完全に壊したり、奇妙な入力をアプリケーションのデータベースに保存したり、後で何らかの方法でプルしたり解析したりすることができます。

この種のテストの一般的なルールは単純です。既知の正常なバックアップから復元するまで、テストは行われません。自動インジェクションテスト後、アプリケーションを通常の動作状態で検討する必要があります。

5
Daniel Miessler