ホームページ > php教程 > php手册 > SQL インジェクションの脆弱性を利用してバックエンドにログインする

SQL インジェクションの脆弱性を利用してバックエンドにログインする

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-21 08:52:07
オリジナル
1136 人が閲覧しました

タイトル: 仕事の都合上、WEB セキュリティに関する関連知識を学ぶ必要があるため、それを要約するためにこの記事を書いており、それ以外の目的はありません。この記事を読む読者は、SQL ステートメントを作成した経験があるか、SQL ステートメントを理解できることを前提としています

海外では 2002 年の時点で既に SQL インジェクションの脆弱性に関する技術記事が数多く掲載されていましたが、中国では 2005 年頃から始まったものです。

現在、SQL インジェクションの脆弱性は過去のものかというと、あらゆる規模の国内 Web サイトがすでに脆弱性を修正しています。しかし、あらゆる秘密には必ず隙があります。侵入は偶然ですが、安全は絶対に避けられません。

数日前、インターネット上で大きく拡散した「トレーラー」事件は、私たちに安全への警鐘を鳴らしました。

Web サイトを開発する場合、セキュリティ上の理由から、ページから渡される文字をフィルタリングする必要があります。通常、ユーザーは、URL アドレス バー、ログイン インターフェイス、メッセージ ボード、検索ボックスなどのインターフェイスを通じてデータベースのコンテンツを呼び出すことができます。これにより、ハッカーが悪用する機会が多くなります。最悪の場合、データが漏洩したり、サーバーがダウンしたりする可能性があります。

今では、多くの Web サイト開発者がこのことを知っていますが、その理由を知りませんし、私も同様なので、それをすぐに補って学習コンテンツとしてまとめます。初心者の方の入門になれば幸いです。

1. SQL インジェクションの手順

a) インジェクションポイントを見つける (ログインインターフェイス、メッセージボードなど)

b) ユーザーが自分で SQL ステートメントを構築します (例: ' または 1=1#。これについては後で説明します)

c) SQL ステートメントをデータベース管理システム (DBMS) に送信します

d) DBMS はリクエストを受信し、リクエストをマシンコード命令に解釈し、必要なアクセス操作を実行します

e) DBMS は返された結果を受け取り、処理してユーザーに返します

ユーザーは特別な SQL ステートメントを作成するため、(SQL ステートメントが十分に柔軟である限り) 特別な結果が返される必要があります。

以下では、例を通して SQL インジェクションを説明します

2. SQL インジェクションの例の詳細な説明(上記のテストは、サーバー上で magic_quote_gpc が有効になっていないことを前提としています)

1) 準備作業

まず、SQL インジェクションの脆弱性を実証し、バックエンド管理者インターフェイスにログインしましょう

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

CREATE TABLE `users` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`ユーザー名` varchar(64) NOT NULL,

`パスワード` varchar(64) NOT NULL,

`email` varchar(64) NOT NULL,

主キー (`id`)、

UNIQUE KEY `username` (`username`)

) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

テスト用のレコードを追加します:

INSERT INTO users (ユーザー名、パスワード、メールアドレス)

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

次に、ログイン インターフェイスのソース コードを貼り付けます:


<頭>
SQL インジェクションのデモ



  <フィールドセット>
    Sql 注入演示
    <表>
     
        用户名:
       
     
     
        密 码:
       
     
     
       
       
     
   
 


  附上效果图:

  ユーザー ポイントの提交の際、表単位のデータ提交を行う予定です。validate.php 面、validate.php 面を使用して、ユーザーが入力したユーザー名とパスワードの有無を判断します。場所)

  代次如下:


<頭>
登录验证


$conn=@mysql_connect("localhost",'root','') または die("データベース库连接失败!");;

mysql_select_db("injection",$conn) または die("您要选择的データ据库不存在");

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

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

$sql="ユーザー名 = '$name' およびパスワード = '$pwd' のユーザーから * を選択";

$query=mysql_query($sql);

$arr=mysql_fetch_array($query);

if(is_array($arr)){

header("Location:manager.php");

}else{

echo "您的用户名または秘密输入有误,请重新登录!";

}

?>

  ないことに注意してください、私たちはユーザーを直接転送して、データ (ユーザー名と秘密コード) を直接逆実行し、特別な文字のフィルタリングを実行せず、明白になるのを待ちます。

  暗号解析: ユーザー名と暗号が両方とも一致した場合、成功した場合は管理操作インターフェイス (manager.php) にジャンプし、失敗した場合はわかりやすいメッセージが表示されます。

  登録に成功したインターフェイス:

  ログイン失敗のヒント:

この時点で準備作業は完了したので、これからハイライトである SQL インジェクション

を開始します。

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

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

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

ユーザー名 = 'marcofly' およびパスワード = md5('test')

のユーザーから * を選択

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

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

ユーザー名 = '' または 1=1#' およびパスワード = 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# は使用できません。しかし、これは、私たちに対策がないという意味ではありません。ユーザーがデータベースを操作する方法は複数あることを知っておく必要があります。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート