WebGaot 6-2 SQL Injection (intro)

No.9 Try It! String SQL injection

コード内のクエリは、前の例で見たように動的なクエリを構築します。このクエリは文字列を連結して作られているため、String SQL Injectionの影響を受けやすくなっています。

"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";

以下のフォームを使って、usersテーブルからすべてのユーザーを取得してみてください。完全なリストを取得するために、特定のユーザ名を知る必要はありません。

f:id:hirose-test:20210404201910j:plain

f:id:hirose-test:20210404201105j:plain

説明します。or '1' = '1'は常に真と評価されるため、この注入は機能します('1'の文字列終了リテラルは、クエリ自体で閉じられているため、注入してはいけません)。
つまり、注入されたクエリは基本的に次のようになります。SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or TRUE これは、その前に何があっても、常に true と評価されます。

No.10 Try It! Numeric SQL injection

コード内のクエリは、前述の例のように動的クエリを構築します。コード内のクエリは、数値を連結して動的クエリを構築するため、Numeric SQLインジェクションの影響を受けやすくなっています。

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;

以下の2つの入力フィールドを使って、usersテーブルからすべてのデータを取得してみましょう。
警告。これらのフィールドのうち1つだけがSQLインジェクションの影響を受けます。すべてのデータをうまく取得するためには、どちらのフィールドかを調べる必要があります。

f:id:hirose-test:20210404202300j:plain

f:id:hirose-test:20210404202321j:plain

No.11 ストリングス SQL インジェクションによる機密性の侵害

システムがSQLインジェクションに対して脆弱な場合、システムのCIAトライアドの側面を簡単に侵害することができます(CIAトライアドについてよく知らない方は、一般カテゴリのCIAトライアドのレッスンをご覧ください)。次の3つのレッスンでは、SQLストリングインジェクションやクエリチェイニングなどのテクニックを使って、CIA三要素の各側面を侵害する方法を学びます。
このレッスンでは、「機密性」について学びます。機密性は、攻撃者がSQLインジェクションを使ってデータベースからクレジットカード番号などの機密データを読み取ることで、簡単に侵害されてしまいます。

What is String SQL injection?

アプリケーションの中で、文字列を連結してクエリを動的に構築すると、ストリングSQLインジェクションの影響を非常に受けやすくなります。
入力が文字列パラメータとしてクエリに挿入される文字列を取る場合、構築されたクエリを引用符を使って簡単に操作し、特定のニーズに合わせて文字列を形成することができます。例えば、文字列パラメータの最後を引用符で囲み、その後に独自のSQLを入力することができます。

It is your turn!

あなたは大企業に勤めるジョン・スミスという社員です。この会社には社内システムがあり、すべての社員が自分の所属する部署や給与などの社内データを見ることができます。
このシステムでは、従業員は自分のデータを見るために、固有の認証TANを使用する必要があります。
あなたの現在のTANは3SL99Aです。
あなたは常に最も稼いでいる従業員になりたいと思っているので、このシステムを利用して、自分の内部データを見る代わりに、同僚全員のデータを見て、彼らの現在の給与を確認したいと考えています。
以下のフォームを使用して、従業員テーブルからすべての従業員データを取得してみてください。必要な情報を得るために、特定の名前やTANを知る必要はありません。
あなたの要求を実行するクエリは次のようになることがすでにわかりました。

"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "';

f:id:hirose-test:20210404203927j:plain

/* -----codeの行番号----- */