この記事では主に SQL インジェクションの意味と SQL インジェクションの実行方法について説明します。対象となるのは主にテスターです SQL インジェクションの実行方法を理解することで、ログイン、パブリッシング、その他のモジュールにおける SQL 攻撃の脆弱性をテストするのに役立ちます SQL インジェクションを防ぐ方法については、開発者が理解する必要があることを理解する必要があります ~ しかし、素晴らしいものとして原理をテストして明確にすることで、バグの原因をより徹底的に理解できるようになります~ さて、早速、本題に入りましょう~
推奨コース: MySQL チュートリアル
##SQL インジェクション (攻撃) を理解するには?SQL インジェクションは、SQL コードを入力パラメータに追加し、それを解析および実行のためにサーバーに渡す攻撃手法です。
SQL インジェクション攻撃とは、入力パラメータがフィルタリングされず、分析のために SQL ステートメントに直接接続され、実行が予期しない動作に達する場合であり、SQL インジェクション攻撃と呼ばれます。
SQL インジェクション攻撃の原則:SQL インジェクション攻撃は、アプリケーションが入力コンテンツを使用してデータベースにアクセスするための動的 SQL ステートメントを構築するときに発生します。 SQL インジェクションは、フィルターされていないユーザー入力を含む文字列として渡されるストアド プロシージャをコードで使用している場合にも発生する可能性があります。 SQL インジェクションにより、攻撃者がアプリケーション ログインを使用してデータベース内のコマンドを実行できる可能性があります。
アプリケーションがデータベースに接続するために過度の特権を持つアカウントを使用している場合、この問題は深刻になる可能性があります。一部のフォームでは、ユーザーが入力した内容が動的 SQL コマンドの構築に直接使用されたり、ストアド プロシージャの入力パラメーターとして使用されたりすることがありますが、これらのフォームは SQL インジェクション攻撃に対して特に脆弱です。多くの Web サイト プログラムを作成すると、ユーザー入力の正当性が判断されなかったり、プログラム内の変数が適切に処理されなかったりして、アプリケーションにセキュリティ リスクが発生します。このようにして、ユーザーはデータベース クエリ コードを送信して機密情報を取得したり、プログラムから返された結果に基づいてサーバー全体を制御したりできるため、SQL インジェクションが発生します。
SQL インジェクションは通常の WWW ポートからアクセスされ、表面的には通常の Web ページアクセスと変わらないため、現在市販されているファイアウォールでは SQL インジェクションのアラートは発行されません。 IIS ログを確認しない 習慣は、長い間気付かないうちに侵されている可能性があります。ただし、SQL インジェクション方法は非常に柔軟であるため、インジェクション中に多くの予期せぬ状況が発生し、目的のデータを正常に取得するには賢明な SQL ステートメントを構築する必要があります。
SQL インジェクションはどのように行われるのでしょうか?1. バックエンド データベースのクラッキングは、Web サイトから機密情報を盗むために最も一般的に使用される方法です。
2. インジェクションでは、データベースのストアド プロシージャを使用して、特権昇格やその他の操作を実行できます。
3. 攻撃者は、SQL サーバーに送信された入力パラメータを使用して、実行可能な SQL コードを構築します ( get リクエスト、post リクエスト、http ヘッダー情報、Cookie に追加されます)
SQL インジェクション攻撃を実行するにはどうすればよいですか?PHP プログラミング言語と mysql データベースを例に、SQL インジェクション攻撃の構築スキルと構築方法を紹介します。
1. 数値インジェクション
Inブラウザのアドレス 列を入力します: learn.me/sql/article.php?id=1。これは get インターフェイスです。このリクエストの送信は、クエリ ステートメントの呼び出しと同じです:
$sql = "SELECT * FROM article WHERE id =",$id
通常の状況では、 id= を返す必要があります。 1 件の記事情報。次に、ブラウザのアドレス バーに learn.me/sql/article.php?id=-1 OR 1 =1 と入力すると、これは SQL インジェクション攻撃であり、すべての記事の関連情報が返される可能性があります。なぜそうなるのでしょうか?
これは、id = -1 が常に false、1=1 が常に true、すべての where ステートメント全体が常に true であるためです。そのため、where 条件は、where 条件を追加しないことと同じであり、その後クエリを追加します。結果はテーブルの内容全体と等価です
2. 文字列注入
このようなユーザー ログイン シナリオがあります: ログイン インターフェイスにはユーザー名とパスワードの入力ボックスと送信ボタンが含まれています。ユーザー名とパスワードを入力して送信します。
これは投稿リクエストです。ログインするときは、インターフェース learn.me/sql/login.html を呼び出し、最初にデータベースに接続してから、投稿に含まれるユーザー名とパスワードのパラメータ検証を実行します。バックグラウンドでのリクエストパラメータ、つまりSQLクエリプロセス。正しいユーザー名とパスワードが user と pwd123 であると仮定します。正しいユーザー名とパスワードを入力して送信します。これは、次の SQL ステートメントを呼び出すのと同じです:
SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'
ユーザー名とパスワードは両方とも文字列であるため、 SQL インジェクションメソッドは、パラメータによって運ばれるデータは、mysql で注釈が付けられた文字列になります。 mysql には 2 つのコメント メソッドがあります:
1) '#': '#' 以降のすべての文字列はコメントとして扱われます
ユーザー名入力: user'# (単一 一重引用符で閉じます)ユーザーの左側)、任意のパスワード (例: 111) を入力し、送信ボタンをクリックします。 SQL ステートメントと同等:
SELECT * FROM user WHERE username = 'user'#'ADN password = '111'
'#' はコメント化されており、次と同等:
SELECT * FROM user WHERE username = 'user'
2) '-- ' (-- の後にスペースがあります): '- - '次の文字列はコメントとして扱われます
ユーザー名入力: user'-- (- の後にスペースがあり、ユーザーの左側の一重引用符が単一引用符で閉じられていることに注意してください)。パスワードを次の場所に入力します。 :111 のように入力し、送信ボタンをクリックします。 SQL ステートメントと同等:
SELECT * FROM user WHERE username = 'user'-- 'AND password = '111' SELECT * FROM user WHERE username = 'user'-- 'AND password = '1111'
'-- ' はコメント化されており、次のステートメントと同等:
SELECT * FROM user WHERE username = 'user'
因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为'user'的账号,这是十分危险的事情。
以上がSQLインジェクション攻撃の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。