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

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

WBOY
WBOYオリジナル
2016-07-13 10:39:58919ブラウズ

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 インジェクションの脆弱性を実証し、バックエンド管理者インターフェイスにログインしましょう

まず、テスト用のデータ テーブルを作成します:

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

CREATETABLE `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 users (username,password,email)

VALUES('MarcoFly',md5('test'),'marcofly@test.com');



次に、ログインインターフェイスのソースコードを貼り付けます:
コードをコピーします コードは次のとおりです。次のように:



SQL インジェクションのデモ





SQL インジェクションのデモ lt; td & lt; パスワード: & lt;/td & lt; 「パスワード」&;/td>
ユーザーが送信ボタンをクリックすると、フォーム データが validate.php ページに送信されます。 validate.php ページは、ユーザーが入力したユーザー名とパスワードが要件を満たしているかどうかを判断するために使用されます (このステップは重要であり、多くの場合、SQL が抜け穴の場所です)

コードは次のとおりです:



コードをコピーします

コードは次のとおりです:



ログイン認証


$conn=@mysql_connect("localhost",'root','')or die("データベース接続に失敗しました!");;

mysql_select_db("injection",$conn) または die("選択したいデータベースが存在しません");

$name=$_POST['ユーザー名'];

$pwd=$_POST['パスワード'];

$sql="select * from users where username='$name' andpassword='$pwd'";

$query=mysql_query($sql);

$arr=mysql_fetch_array($query);

if(is_array($arr)){

header("Location:manager.php");

}その他{

with echo "ユーザー名またはパスワードが間違って入力されました。もう一度ログインしてください!";

}

?>




私たちがユーザーによって送信されたデータ (ユーザー名とパスワード) を直接実行し、特殊文字フィルターを実装していないことに気づきましたか?後でわかりますが、これは致命的です。
コード分析: ユーザー名とパスワードが一致すると、管理者操作インターフェイス (manager.php) にジャンプします。一致しない場合は、わかりやすいプロンプト メッセージが表示されます。
この時点で、準備作業は完了したので、これからハイライトである SQL インジェクションを開始します

2) SQL ステートメントを構築します

正しいユーザー名 (marcofly) とパスワード (テスト) を入力した後、[送信] をクリックすると、「ようこそ管理者」インターフェイスに戻ります。

送信したユーザー名とパスワードは SQL クエリ ステートメントに合成され、次のようになります:

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

select * from users where username='marcofly' andpassword=md5('test')


明らかに、ユーザー名とパスワードは次と同じです。以前に説明したとおり、間違いなく正常にログインできるでしょう。しかし、間違ったユーザー名またはパスワードを入力した場合はどうなるでしょうか? 当然、ログインできなくなります。これは通常の状況では当てはまりますが、SQL インジェクションの脆弱性がある Web サイトの場合は、特別な「文字列」が構築されている限り、正常にログインできます。

例: ユーザー名入力ボックスに「' または 1=1#」と入力し、任意のパスワードを入力します。この時点で合成された SQL クエリ ステートメントは次のとおりです。

コードをコピー コードは次のとおりです:
select * from users where username='' or 1=1#' and password=md5('')

意味分析: 「#」は mysql のコメント文字であるため、ポンド記号以降の内容は mysql によってコメント内容とみなされ、実行されません。つまり、次の 2 つの SQL ステートメントは同等です。

コードをコピー コードは次のとおりです:
select * from users where username='' or 1=1#' and password=md5('')




と同等ですコードをコピーします コードは次のとおりです:
select *from users where username='' or 1=1


1=1 は常に true、つまり where 句は常に true であるため、さらにSQL を簡略化し、次の select ステートメントに相当します:


コードをコピーします コードは次のとおりです:
select * from users


はい、この SQL ステートメントの機能は、users テーブル内のすべてのフィールドを取得することです
ヒント: ' または 1=1# の一重引用符の機能がわからない場合は、自分で SQL ステートメントをエコーすることができます。それは一目瞭然でしょう。
ほら、構築された SQL ステートメントには、これほど恐ろしい破壊力があるのです。これを見れば、SQL インジェクションについて合理的に理解できるようになると思います~
はい、SQL インジェクションはとても簡単です。しかし、実際の状況に応じて柔軟な SQL 文を構築することはそれほど簡単ではありません。基本を理解したら、自分でゆっくりと探索してみてください。
バックグラウンド ログイン ウィンドウから送信されたデータが管理者によって特殊文字で除外されたらどうなるか考えたことはありますか? この場合、ユニバーサル ユーザー名または 1=1# は使用できません。しかし、これは私たちに対策がないという意味ではなく、ユーザーがデータベースを操作する方法は複数あることを知っておく必要があります。

www.bkjia.com本当http://www.bkjia.com/PHPjc/727938.html技術記事 Web サイトを開発する場合、セキュリティ上の理由から、ページから渡される文字をフィルタリングする必要があります。通常、ユーザーは次のインターフェイスを通じてデータベースのコンテンツを呼び出すことができます: URL アドレス バー、ログイン インターフェイス...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。