ASPホール全接触-入門編
B/Sモードのアプリケーション開発が進むにつれて、このようなモードを使ってアプリケーションを作成するプログラマーが増えてきました。しかし、この業界の入門の敷居が高くないため、プログラマーのレベルと経験もまちまちで、かなりの部分のプログラマーがコードを書く時、ユーザーがデータを入力する合法性を判断していないので、アプリケーションにセキュリティ上の危険があります。ユーザはデータベースクエリコードの一部を提出することができ、プログラムの結果によって、彼が知りたいデータを得ることができます。これはSQL Injectionと呼ばれるSQL注入です。SQL注入は正常なWWポートからアクセスし、表面は一般的なWebページへのアクセスと大差がないように見えるので、現在の市場のファイアウォールはSQLに対してアラームを注入しません。管理者がIISログを確認していないと、侵入してくる可能性があります。しかし、SQL注入の手法はかなり柔軟で、注入時には多くの意外な状況に遭遇します。具体的な状況によって分析できますか?構造が巧みなSQL文で、希望のデータを取得できます。国情によって、国内のウェブサイトはASP+AccessあるいはSQLServerの70%以上を使って、PHP+MySQはL 20%を占めて、その他の10%に足りません。本論文では、入門から上級までASP注入の方法とテクニックを説明します。PHP注入の文章はNB連合のもう一人の友達zwellによって書かれています。安全作業者とプログラマーに役立つことを望んでいます。ASP注入を知っている友達も入門編を飛び越えないでください。一部の人は注入の基本的な判断方法に対してまだ誤解があります。みんなは準備ができましたか?Lets Go...入門編SQL注入を試したことがないなら、まずIEメニュー=>ツール=>Internetオプション=>高度=>友好HTTPエラーメッセージを表示する前のチェックを外します。さもないと、サーバがどんなエラーを返しても、IEはHTTP 500サーバエラーとしてのみ表示され、より多くのヒント情報を得ることができません。第一節、SQL注入原理は以下の通りです。ウェブサイトのwww.19 cn.comから開始します。サイトのトップページには、「IEが新しいウィンドウを開けられないさまざまな解決方法」というリンクがあります。http://www.19cn.com/showdetail.asp?id=49私たちはこの住所の後にシングルクォーテーションマークを付けます。サーバは以下のエラーメッセージを返します。Microsoft JET Databaseエラー80040 e 14文字列の構文エラーは検索式ID=49にあります。/showdetail.asp、行8はこのエラーから以下の点を確認できます。1.ウェブサイトはAccessデータベースを使っています。JETエンジンでデータベースに接続します。ODBCを通じてではありません。2.プログラムはクライアントから提出されたデータがプログラム要求に合っているかどうかを判断していません。3.このSQL文で照会したテーブルにIDというフィールドがあります。上記の例から分かるように、SQL注入の原理はクライアントから特別なコードを提出して、プログラムとサーバの情報を収集して、あなたが思い付いた資料を得ることです。第二節、SQL注入が可能かどうかを判断する。 第一節を見たら、「私もよくこのようにテストをしますが、注入できるかどうかは簡単ではないですか?」 実は、これは一番いい方法ではないです。なぜですか? まず、必ずしもサーバごとにIISが特定のエラーを返してクライアントに提示するとは限りません。プログラムにcint(パラメータ)などの語句を入れたら、SQL注入は成功しませんが、サーバもエラーが発生します。システム管理者に連絡してください。 その次に、部分はSQLに対して注入して少し知っているプログラマーが、シングルの引用符をフィルタリングすれば安全だと思っています。このような状況は少なくないです。シングルの引用符でテストすれば、注入点が測定できないです。 では、どのようなテスト方法が正確ですか?答えは以下の通りです ①http://www.19cn.com/showdetail.asp?id=49 ②http://www.19cn.com/showdetail.asp?id=49 ;;and 1=1 ③http://www.19cn.com/showdetail.asp?id=49 ;;and 1=2 これは経典の1=1、1=2のテスト法です。どう判断しますか?上の3つのURLを見て返したら分かります。 注入できる表現: ① 正常表示(これは必然的で、そうでなければプログラムに誤りがあります) ② 正常に表示され、内容は基本的に①と同じです。 ③ ヒントBOFまたはEOF(プログラムが何の判断もしていない場合)、またはヒントが記録されていない(RS.eofが判断された場合)、または表示内容が空です。 error レム next) 注入してはいけないと判断しやすくなりますが、①同様に正常に表示されています。②と③は、プログラム定義のエラーメッセージがあります。 もちろん、これは着信パラメータが数字型の時に使う判定方法です。実際に使うと文字型と検索型のパラメータがあります。中級編の「SQL」に一般ステップを入れて分析します。第三節、データベースの種類と注入方法を判断する。 異なるデータベースの関数、注入方法には違いがありますので、注入前にデータベースの種類を判断します。一般的にASPが最もよく使うデータベースはAccessとSQLServerで、ネット上で99%を超えるウェブサイトがその一つです。 どのようにプログラムを教えてあげましょうか?見てみます SQLServerにはシステム変数があります。サーバIISのヒントがオフされていない場合、SQLServerがエラーメッセージを返すと、エラーメッセージから直接に取得することができます。 http://www.19cn.com/showdetail.asp?id=49 ;;and user>0 この文は簡単ですが、SQLServer特有の注入方法のエッセンスが含まれています。私自身も無意識のテストでこのような効率の高い推測方法を発見しました。その意味を見てみましょう。まず、前の文は正常で、andに重点があります。 user>0は、userがSQLServerの内蔵変数であることを知っています。その値は現在接続されているユーザー名で、タイプはnvarharです。一つのnvarrharの値をintの数0と比較して、システムはまずnvarrharの値をint型に転換しようとします。もちろん、回転中は間違いがあります。SQLServerのエラーメッセージはnvarharの値を ”abc」 変換データタイプは 要点 の列の時文法の誤りが発生して、ほほほ、abcはまさに変数のuserの値で、このようにして、たやすくデータベースのユーザー名を持ちました。今後の紙面では、このような方法を使った言葉が多く見られます。 ちなみに、ご存知のように、SQLServerのユーザーSAはAdminstratorsの権限に相当するキャラクターであり、sa権限を持っており、ほぼ間違いなく本体のAdministratorを手に入れることができます。上の方法で簡単にテストできます。saで登録するかどうかは、saで登録すると、ヒントは「dbo」をintに変換する列にエラーが発生します。「sa」ではありません。 サーバIISがエラーメッセージを返すことができない場合、データベースの種類はどう判断しますか?AccessとSQLServerとの区別から入手できます。AccessとSQLServerは、データベース内のすべてのオブジェクトを格納するテーブル、Accessはシステムテーブル[msyssobjects]にありますが、Web環境下でこの表を読むと「権限がない」と表示されます。SQLServerは表[syssobject]にあります。 注入できることを確認した場合は、次のような文言を使います。 http://www.19cn.com/showdetail.asp?id=49 ;;and (プロジェクト count(*) from syssobject)>0 http://www.19cn.com/showdetail.asp?id=49 ;;and (プロジェクト count(*) from msyssobject)>0 データベースがSQLServerなら、最初のURLのページと元のページです。http://www.19cn.com/showdetail.asp?id=49大体同じです。第二のウェブサイトは表msyssobjectsが見つからないため、エラーが発生しました。たとえプログラムにエラーがあっても、ページは元のページと全く違っています。 もしデータベースがAccessを使うならば、情況はある程度異なっていて、最初のURLのページはもとのページと完全に異なっています。第二のURLは、データベース設定がシステムテーブルを読むことを許可しているかどうかによって、通常は許可されていないので、元のURLとは全く違っています。ほとんどの場合、最初のアドレスでシステム用のデータベースの種類が分かります。第二のアドレスはIISエラーメッセージを開く時の検証としてのみ使用されます。