ホームページ >バックエンド開発 >PHPチュートリアル >PHP での SQL インジェクション分析

PHP での SQL インジェクション分析

WBOY
WBOYオリジナル
2016-07-29 09:15:021035ブラウズ

1. 注射攻撃の種類
攻撃の動機にはさまざまな種類があるかもしれませんが、一見すると、さらに多くの種類があるように見えます。これは、悪意のあるユーザーが複数のクエリを実行する方法を見つけた場合に当てはまります。これについては、この記事の後半で詳しく説明します。

など スクリプトが SELECT 命令を実行している場合、攻撃者は、以下に示すように、「1=1」などの条件を WHERE 句に挿入することで、テーブル内のすべての行を強制的に表示できます (挿入された部分は太字で示されています)。 :
SELECT * FROM wines WHEREvariation = 'lagrein' OR 1=1;'

前に説明したように、これはテーブルの一般的な構造 (これは一般的なレコード) を明らかにするため、それ自体が有益な情報になる可能性があります。機密情報が含まれていることを示しています。
更新された指令は、より差し迫った脅威をもたらす可能性があります。 SET 句に他の属性を配置することにより、攻撃者は、次の例 (挿入された部分が太字で示されています) のように、現在更新されているレコード内の任意のフィールドを変更できます。 UPDATE wines SET type='red', 'vintage'='9999' WHEREvariation = 'lagrein'

更新命令の WHERE 句に 1=1 などの true 条件を追加することで、この変更の範囲を拡張できます次の例のように、すべてのレコードに追加されます (注入部分が太字で示されています):

UPDATE wines SET type=’red’, ‘vintage’=’9999 WHEREvariation = ‘lagrein’ OR 1=1;’

おそらく最も危険な命令は DELETE です - 想像するのは難しくありません。インジェクション手法は、これまでに説明したものと同じです。以下の例のように、WHERE 句を変更することで影響を受けるレコードの範囲を拡張します (インジェクション部分が太字で示されています)。 DELETE FROM wines WHEREvariation = ‘lagrein’ OR 1=1;’


2. 複数のクエリ インジェクションは、単一のクエリに複数の破壊的な命令が含まれることを許可するため、攻撃者が引き起こす可能性のある潜在的な被害を悪化させます。 MySQL データベースを使用する場合、攻撃者はクエリに予期しないターミネータを挿入することでこれを簡単に達成できます。挿入された引用符 (一重または二重) は予期される変数の終わりを示し、ディレクティブをセミコロンで終了します。ここで、終了した元のコマンドの最後に追加の攻撃コマンドを追加できます。最終的な破壊的なクエリは次のようになります。

<code><span><span>SELECT</span> * <span>FROM</span> wines <span>WHERE</span> variety = <span>'lagrein'</span>;</span><span><span>GRANT</span><span>ALL</span><span>ON</span> *.* <span>TO</span><span>'BadGuy@%'</span> IDENTIFIED <span>BY</span><span>'gotcha'</span>;</span>' </code>

このインジェクションは、新しいユーザー BadGuy を作成し、それにネットワーク権限 (すべてのテーブルに対するすべての権限) を付与します。これには「不気味な」パスワードも追加されます。 SELECT ステートメント。前の記事のアドバイスに従い、プロセス ユーザーの権限を厳密に制限した場合、Web サーバー デーモンには取り消した GRANT 権限がなくなっているため、これは機能しません。しかし理論的には、このような攻撃により、BadGuy はデータベースに対してやりたいことを何でもできるようになる可能性があります。

そのようなマルチクエリが MySQL サーバーによって処理されるかどうかについては、結論は一意ではありません。これは、MySQL のバージョンの違いが原因である場合もありますが、ほとんどの場合、複数のクエリの存在方法が原因です。 MySQL の監視プログラムでは、このようなクエリを完全に許可します。一般的に使用される MySQL GUI-phpMyAdmin は、最後のクエリの前に以前のすべてのコンテンツをコピーし、これのみを実行します。

ただし、インジェクション コンテキスト内の複数のクエリのほとんどは、PHP の mysql 拡張機能によって管理されます。幸いなことに、デフォルトでは、クエリ内で複数の命令を実行することはできません。2 つの命令 (上記のインジェクションなど) を実行しようとすると、エラーが設定されず、情報も出力されません。この場合、PHP はデフォルトの動作を「定期的に」実装するだけですが、ほとんどの単純なインジェクション攻撃からは保護されます。

PHP5 の新しい mysqli 拡張機能 (http://php.net/mysqli を参照) は、mysql と同様に、本質的に複数のクエリをサポートしませんが、複数のクエリの実装をサポートする mysqli_multi_query() 関数を提供します。それを行う。

しかし、SQLite にとっては、状況はさらに悲惨です。SQLite は PHP5 にバンドルされている埋め込み可能な SQL データベース エンジンであり (http://sqlite.org/ および http://php.net/sqlite を参照)、その使いやすさに魅力を感じています。ユーザーの注目を集めます。場合によっては、データベースがバッチ クエリ、特にバッチ INSERT ステートメント処理を最適化でき、非常に効率的であるため、SQLite はデフォルトでこのような複数命令クエリを許可します。ただし、クエリの結果がスクリプトで使用される場合 (たとえば、レコードを取得するために SELECT ステートメントを使用する場合)、sqlite_query() 関数では複数のクエリを実行できません。 3. INVISION Power BOARD SQL インジェクションの脆弱性
Invision Power Board はよく知られたフォーラム システムです。 2005 年 5 月 6 日、ログイン コードに SQL インジェクションの脆弱性が発見されました。その発見
著者はGulfTech Security ResearchのJames Bercegay氏です。
このログイン クエリは次のようになります:

<code><span>$DB</span>->query(<span>"SELECT * FROM ibf_members WHERE id=<span>$mid</span> AND password='<span>$pid</span>'"</span>); </code>

其中,成员ID变量midID

以上就介绍了PHP中SQL注入解析,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。