Web サイト開発では、誤ってセキュリティ上の問題を引き起こす可能性があります。以下に、よく使用される SQL インジェクション攻撃手法の概要を紹介します。初心者の方は参考にしてみてください。
1. エスケープ文字が正しくフィルタリングされない
この形式のインジェクションまたは攻撃は、ユーザーの入力がエスケープ文字でフィルタリングされず、SQL ステートメントに渡されるときに発生します。これにより、アプリケーションのエンド ユーザーはデータベース上のステートメントに対して操作を実行することになります。たとえば、次のコード行はこの脆弱性を示しています:
コードは次のとおりです | コードをコピー |
"SELECT * FROM users WHERE name = ' " + userName + " ' ;" |
このコードは、users テーブルから特定のユーザーを削除するように設計されていますが、ユーザー名が悪意のあるユーザーによって特定の方法で偽造された場合、このステートメントは作成者が期待したコード以上のものを実行する可能性があります。たとえば、ユーザー名変数 (ユーザー名など) が a' または 't' = 't に設定されている場合、元のステートメントは次のように変更されます。
コードをコピー | |
SELECT * FROM users WHERE name = 'a' OR 't' = 't';
|
SQL Server などの一部の SQL サーバーでは、複数のステートメントの実行を含む、あらゆる SQL コマンドをこのメソッドを通じて挿入できます。次のステートメントの username の値により、「users」テーブルが削除され、すべてのデータが「data」テーブルから選択されます (実際には各ユーザーに関する情報が明らかになります)。
コードをコピー | |
a';DROP TABLE ユーザー; SELECT * FROM data WHERE name LIKE '%
|
コードをコピー | |
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '%';
|
2. 不正な型の処理
この形式の攻撃は、ユーザーが指定したフィールドが強力な型ではない場合、または型強制が実装されていない場合に開始されます。この攻撃は、SQL ステートメントで数値フィールドを使用するときに、プログラマがユーザー入力の有効性 (数値であるかどうか) をチェックしなかった場合に発生する可能性があります。例:
コードをコピー | |
「SELECT * FROM data WHERE id = " + a_variable + ";"
|
コードをコピー | |
SELECT * FROM data WHERE id = 1;
|
MYSQL サーバーの mysql_real_escape_string() 関数の脆弱性など、データベース サーバー ソフトウェアに脆弱性が存在する場合があります。この脆弱性により、攻撃者は不正な Unicode エンコーディングに基づいて SQL インジェクション攻撃を実行することが可能になります。
4. ブラインド SQL インジェクション攻撃
いわゆるブラインド SQL インジェクション攻撃は、Web アプリケーションが攻撃に対して脆弱であるにもかかわらず、その結果が攻撃者には見えない場合に発生します。脆弱な Web ページではデータが表示されず、正規のステートメントに挿入された論理ステートメントの結果に基づいて異なるコンテンツが表示される場合があります。取得したバイトごとに新しいステートメントを慎重に作成する必要があるため、この攻撃は非常に時間がかかります。しかし、脆弱性の場所とターゲット情報の場所が特定されると、Absinthe と呼ばれるツールによって攻撃を自動化できます。
5. 条件付き応答
通常のアプリケーション画面でデータベースに論理ステートメントを強制的に評価させる SQL インジェクションがあることに注意してください。
コードをコピー | |
bookId = 'OOk14cd' AND 1=1 のブックリストから本のタイトルを選択します
|
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2 ページが SQL インジェクション攻撃に対して脆弱な場合は、異なる結果が生じる可能性があります。このようなインジェクションはブラインド SQL インジェクションが可能であることを証明し、攻撃者が別のテーブルの特定のフィールドの内容に基づいて真正性を判断できるステートメントを設計できるようになります。
6. 条件付きエラー
WHERE ステートメントが true の場合、このタイプのブラインド SQL インジェクションにより、データベースはエラーの原因となるステートメントを強制的に評価し、結果として SQL エラーが発生します。例:
コードをコピー | |
コードをコピー | |
SELECT * FROM users WHERE username = {username} AND パスワード = {パスワード} [/コード] その後、ユーザーは任意のユーザー名と次のパスワードを使用できるようになります: [code='sql']' OR ''=''[/code] これにより、ユーザー名とパスワードを検証するための MySQL クエリは次のようになります: [code='sql'] SELECT * FROM users WHERE username = 'anyuser' AND パスワード = '' または ''='' [/コード] |
コードをコピー | |
関数 quote_smart($value) { $link=mysql_connect('mysql_host','mysql_user','mysql_password'); //逃げに行く if(get_magic_quotes_gpc()) { $value=ストリップスラッシュ($value); } //数字以外のすべてに引用符を追加します if(!is_numeric($value)) { $value="'".mysql_real_escape_string($value,$link)."'"; } $value を返します; } ?> |
[/コード]
quote_smart() 関数は自動的に文字列に引用符を追加するため、自分で引用符を追加する必要がないことに注意してください。
さらに、MySQL バージョンが異なればフィルタリング要件も異なるため、mysql_real_escape_string() が動作するには MySQL 接続が必要であるため、MySQL 接続を 2 番目のパラメータとして渡す必要があることに注意してください。 MySQL がローカル マシンにインストールされている場合は省略できます。ただし、MySQL がローカル マシンにインストールされていない場合、または MySQL にリモートで接続されている場合、このパラメータは必須です。そうでない場合、mysql_real_escape_string() は空の文字列を返します。