ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルにおける SQL インジェクションの脆弱性の例

php_PHP チュートリアルにおける SQL インジェクションの脆弱性の例

WBOY
リリース: 2016-07-13 10:40:17
オリジナル
914 人が閲覧しました

この記事では主にphpのSQLインジェクションの脆弱性の例を紹介しますので、開発時に皆さんも注意してください

Web サイトを開発する場合、セキュリティ上の理由から、ページから渡される文字をフィルタリングする必要があります。通常、ユーザーは、URL アドレス バー、ログイン インターフェイス、メッセージ ボード、検索ボックスなどのインターフェイスを通じてデータベースのコンテンツを呼び出すことができます。これにより、ハッカーが悪用する機会が多くなります。最悪の場合、データが漏洩したり、サーバーがダウンしたりする可能性があります。 ​ 1. SQLインジェクションの手順 ​ a) インジェクションポイントを見つける (ログインインターフェイス、メッセージボードなど) ​ b) ユーザーが自分で SQL ステートメントを構築します (例: ' または 1=1#。これについては後で説明します)。 ​ c) SQL ステートメントをデータベース管理システム (DBMS) に送信します。 ​ d) DBMS はリクエストを受信し、リクエストをマシンコード命令に解釈し、必要なアクセス操作を実行します。 ​ e) DBMS は返された結果を受け取り、処理してユーザーに返します。 ​ ​ ユーザーは特別な SQL ステートメントを作成するため、(SQL ステートメントが十分に柔軟である限り) 特別な結果が返される必要があります。​ 以下では、例を通して SQL インジェクションを説明します。 ​ 2. SQL インジェクション例の詳細な説明 (上記のテストは、サーバー上で magic_quote_gpc が有効になっていないことを前提としています) ​ 1) 準備作業 ​ まず、SQL インジェクションの脆弱性を利用してバックエンド管理者インターフェイスにログインする方法を示します。 ​ まず、テスト用のデータ テーブルを作成します。 ​ コードは以下のように表示されます。 作成可能な `users` ( ​ `id`int(11) NOT NULL AUTO_INCREMENT、 ​ `ユーザー名`varchar(64) NOT NULL、 ​ `password`varchar(64) NOT NULL、 ​ `email`varchar(64) NOT NULL、 ​ 主キー (`id`)、 ​ UNIQUEKEY `ユーザー名` (`ユーザー名`) ​ )ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; ​ ​ ​ テスト用のレコードを追加します。 ​ コードは以下のように表示されます。 INSERTINTO ユーザー (ユーザー名、パスワード、電子メール) ​ VALUES('MarcoFly',md5('test'),'marcofly@test.com'); ​ ​ ​ 次に、ログイン インターフェイスのソース コードを貼り付けます。 コードは以下のように表示されます。 SQL インジェクションのデモ
<フィールドセット> SQL インジェクションのデモンストレーション ユーザー名: パスワード:                                                                                                ​ ​ ユーザーが送信ボタンをクリックすると、フォーム データが validate.php ページに送信されます。 validate.php ページは、ユーザーが入力したユーザー名とパスワードが要件を満たしているかどうかを判断するために使用されます (このステップは重要であり、重要です)。多くの場合、SQL の脆弱性が存在します。 ​ コードは以下のように表示されます。 ​ コードは以下のように表示されます。 ログイン認証
​ ​ ​ ユーザーが送信したデータ (ユーザー名とパスワード) が特殊文字をフィルタリングせずに直接実行されることに気づきましたか? これが致命的であることが後でわかります。 コード分​​析: ユーザー名とパスワードが正常に一致すると、管理者操作インターフェイス (manager.php) にジャンプします。失敗した場合は、わかりやすいプロンプト メッセージが表示されます。 この時点で、準備作業は完了しました。次に、ハイライトである SQL インジェクションを開始します。 ​ 2) SQL ステートメントを構築する ​ 正しいユーザー名 (marcofly) とパスワード (test) を入力した後、「送信」をクリックすると、「管理者へようこそ」インターフェースに戻ります。​ 送信したユーザー名とパスワードは SQL クエリ ステートメントに合成され、次のようになります。 ​ ​ コードをコピーする コードは次のとおりです。 select * from users where username='marcofly' andpassword=md5('test') ​ ​ 明らかに、ユーザー名とパスワードは以前に指定したものと同じなので、間違いなく正常にログインできます。しかし、間違ったユーザー名またはパスワードを入力した場合はどうなるでしょうか? 当然、ログインできなくなります。これは通常の状況では当てはまりますが、SQL インジェクションの脆弱性がある Web サイトの場合は、特別な「文字列」が構築されている限り、正常にログインできます。 ​ 例: ユーザー名入力ボックスに「' または 1=1#」と入力し、任意のパスワードを入力します。この時点で合成された SQL クエリ ステートメントは次のとおりです。 コードは以下のように表示されます: select * from users where username='' or 1=1#' and passwd=md5('') ​ ​ セマンティック分析: 「#」は MySQL のコメント文字であるため、シャープ記号の後の内容は MySQL によってコメント内容とみなされ、実行されません。つまり、次の 2 つの SQL ステートメントは同等です。 コードは以下のように表示されます: ユーザー名 = '' または 1=1#' およびパスワード = md5('') のユーザーから * を選択します ​ に相当 コードは以下のように表示されます: select *from users where username='' または 1=1 ​ ​ 1=1 は常に true、つまり where 句は常に true であるため、SQL をさらに単純化すると、次の select ステートメントと同等になります。 コードは以下のように表示されます: ユーザーから * を選択 ​ はい、この SQL ステートメントの機能は、users テーブル内のすべてのフィールドを取得することです。 ヒント: ' または 1=1# の一重引用符の機能がわからない場合は、SQL ステートメントを自分でエコーすると、一目瞭然です。 ご存知のように、構築された SQL ステートメントは非常に恐ろしい破壊力を持っています。これを見れば、SQL インジェクションについて合理的に理解できるようになると思います。 はい、SQL インジェクションはとても簡単です。しかし、実際の状況に応じて柔軟な SQL 文を構築することはそれほど簡単ではありません。基本を理解したら、自分でゆっくりと探索してみてください。 バックグラウンド ログイン ウィンドウから送信されたデータが管理者によって特殊文字で除外されたらどうなるか考えたことはありますか? この場合、ユニバーサル ユーザー名または 1=1# は使用できません。しかし、これは私たちに対策がないという意味ではなく、ユーザーがデータベースを操作する方法は複数あることを知っておく必要があります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/727559.html技術記事この記事では、主に PHP における SQL インジェクションの脆弱性の例を紹介します。 Web サイトを開発する場合、セキュリティ上の理由から、ページから渡される文字をフィルターする必要があることに誰もが注意する必要があります。 ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート