ホームページ >バックエンド開発 >PHPチュートリアル >一般的に使用される SQL インジェクション攻撃手法のまとめ_PHP チュートリアル

一般的に使用される SQL インジェクション攻撃手法のまとめ_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:11:221361ブラウズ

Web サイト開発では、誤ってセキュリティ上の問題を引き起こす可能性があります。以下に、よく使用される SQL インジェクション攻撃手法の概要を紹介します。初心者の方は参考にしてみてください。

1. エスケープ文字が正しくフィルタリングされない

この形式のインジェクションまたは攻撃は、ユーザーの入力がエスケープ文字でフィルタリングされず、SQL ステートメントに渡されるときに発生します。これにより、アプリケーションのエンド ユーザーはデータベース上のステートメントに対して操作を実行することになります。たとえば、次のコード行はこの脆弱性を示しています:

コードは次のとおりです コードをコピー

"SELECT * FROM users WHERE name = ' " + userName + " ' ;"

このコードは、users テーブルから特定のユーザーを削除するように設計されていますが、ユーザー名が悪意のあるユーザーによって特定の方法で偽造された場合、このステートメントは作成者が期待したコード以上のものを実行する可能性があります。たとえば、ユーザー名変数 (ユーザー名など) が a' または 't' = 't に設定されている場合、元のステートメントは次のように変更されます。

コードは次のとおりですコードをコピー
SELECT * FROM users WHERE name = 'a' OR 't' = 't';

このコードが認証プロセスで使用される場合、割り当て 't' = 't' が常に正しいため、この例では有効なユーザー名の選択を強制できます。

SQL Server などの一部の SQL サーバーでは、複数のステートメントの実行を含む、あらゆる SQL コマンドをこのメソッドを通じて挿入できます。次のステートメントの username の値により、「users」テーブルが削除され、すべてのデータが「data」テーブルから選択されます (実際には各ユーザーに関する情報が明らかになります)。

コードは次のとおりですコードをコピー
a';DROP TABLE ユーザー; SELECT * FROM data WHERE name LIKE '%

最終的な SQL ステートメントは次のようになります:

コードは次のとおりですコードをコピー
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '%';

他の SQL 実装では、セキュリティ対策として同じクエリ内に複数のコマンドを実装しません。これにより、攻撃者が完全に独立したクエリを挿入することは防止されますが、攻撃者がクエリを変更することは防止されません。

2. 不正な型の処理

この形式の攻撃は、ユーザーが指定したフィールドが強力な型ではない場合、または型強制が実装されていない場合に開始されます。この攻撃は、SQL ステートメントで数値フィールドを使用するときに、プログラマがユーザー入力の有効性 (数値であるかどうか) をチェックしなかった場合に発生する可能性があります。例:

コードは次のとおりですコードをコピー

このステートメントから、作成者が a_variable が「id」フィールドに関連する数値であることを望んでいることがわかります。ただし、エンド ユーザーが文字列を選択した場合、エスケープ文字は必要ありません。たとえば、a_variable を 1; DROP TABLE users に設定すると、「users」テーブルがデータベースから削除され、SQL ステートメントは次のようになります。

「SELECT * FROM data WHERE id = " + a_variable + ";"

コードは次のとおりですコードをコピー
SELECT * FROM data WHERE id = 1;

3. データベースサーバーの脆弱性

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 エラーが発生します。例:

コードは次のとおりですコードをコピーusername='Ralph' のユーザーから 1/0 を選択します。

明らかに、ユーザー Ralph が存在する場合、ゼロ除算はエラーを引き起こします。

7. 時間の遅れ

時間遅延はブラインド SQL インジェクションの一種で、挿入されたロジックによっては、SQL エンジンが長いキューや遅延時間ステートメントを実行する可能性があります。攻撃者は、ページの読み込みにかかる時間を測定して、挿入されたステートメントが true かどうかを判断できます。

上記は SQL 攻撃の大まかな分類にすぎません。しかし、技術的に言えば、今日の SQL インジェクション攻撃者は、脆弱な Web サイトを見つける方法において、より賢く、より包括的なものになっています。新しい SQL 攻撃手法がいくつか登場しています。ハッカーはさまざまなツールを使用して、脆弱性の悪用プロセスを高速化できます。 Asprox トロイの木馬について見てみましょう。このトロイの木馬は、主に電子メールを発行するボットネットを通じて拡散します。その動作プロセス全体は次のように説明できます。まず、このトロイの木馬は、制御されたホストによって送信されるスパム電子メールを通じてコン​​ピュータにインストールされます。このトロイの木馬に感染したコンピュータは、起動時に seo/seo.html" target="_blank">検索エンジンを使用して、Microsoft ASP テクノロジを使用してフォームを作成する脆弱な Web サイトを検索するバイナリ コードをダウンロードします。検索結果は SQL インジェクション攻撃のターゲット リストとなり、このトロイの木馬はこれらのサイトに対して SQL インジェクション攻撃を開始し、これらの制御された Web サイトにアクセスしたユーザーが悪意のある JavaScript に騙されます。最後に、このコードはユーザーを 3 番目のサイトに誘導します。このサイトには、パスワードを盗むトロイの木馬などのマルウェアが含まれています。

これまでは、SQL インジェクションの脆弱性が発見され悪用される可能性はそれほど高くありませんでしたが、Web アプリケーションのプログラマに対して、コードをテストしてパッチを適用するよう警告または推奨することがよくありました。しかし最近、攻撃者がこれらの脆弱性を発見し、悪意を持って悪用するケースが増えています。したがって、開発者は、ソフトウェアを展開する前にコードをより積極的にテストし、新しい脆弱性が出現したらすぐにコードにパッチを適用する必要があります。

たとえば、この方法を使用してログイン ウィンドウをバイパスする人もいます。クエリのユーザー名とパスワードが次のようになった場合:

コードは次のとおりですコードをコピー[code='sql']

空の文字列は常に空の文字列と等しいため、クエリ条件は常に true になります。したがって、攻撃者はログインを通じてアクセスすべきデータを参照できるため、MySQL インジェクションのリスクは依然として非常に高いことがわかります。 Web サイトをインジェクション攻撃から保護することは非常に重要です。幸いなことに、PHP はインジェクション攻撃を防ぐのに役立ちます。
MySQL はテーブル内のすべての行を返します。プログラム ロジックによっては、すべてのユーザーが一致するため、すべてのユーザーがログインしている可能性があります。現在、ほとんどの場合、magic_quotes_gpc オプション (これは PHP のデフォルトでもあります) をオンにすると、バックスラッシュが自動的に追加され、すべての '(一重引用符)、"(二重引用符)、(バックスラッシュ)、および null がエスケープされます。ただし、リスクを引き起こすすべての文字がエスケープされるわけではないため、問題はそれほど単純ではありません。この関数は、冗長な SQL 句を引き起こす可能性のあるすべての MySQL 文字をエスケープできる関数です。 この関数を使用するときは注意してください。magic_quotes_gpc オプションがオンになっている可能性があり、mysql_real_escape_string() を使用すると 2 回目のエスケープが発生するためです。次の関数はこの問題を回避します。最初に
を決定します。 magic_quotes_gpc オプションがオンになっているかどうか、そして mysql_real_escape_string() を実行するかどうかを決定します。
[code='php']

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() は空の文字列を返します。

http://www.bkjia.com/PHPjc/629608.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629608.html技術記事 Web サイトの開発では、誤ってセキュリティ上の問題を引き起こす可能性があります。以下に、一般的に使用される SQL インジェクション攻撃手法の概要を紹介します。初心者の方は参考にしてみてください。 1. いいえ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。