WebGaot 6-1 SQL Injection (intro)

No.2 What is SQL?

SQLとは、標準化された(1986年にANSI、1987年にISO)プログラミング言語で、リレーショナル・データベースを管理し、データベース内のデータに対してさまざまな操作を行うために使用されます。 データベースとは、データの集まりのことです。データは行、列、テーブルに整理され、関連する情報を見つけやすくするためにインデックスが付けられています。 従業員を含むSQLテーブルの例、テーブル名は「Employees」です。

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

問題. Bob Francoという従業員の所属部署を検索してみてください。この課題では、あなたには完全な管理者権限が与えられており、認証なしですべてのデータにアクセスできることに注意してください。

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

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

No.3 Data Manipulation Language (DML)

データ操作言語(DML) データ操作言語は、その名の通りデータの操作を扱うもので、SELECT、INSERT、UPDATE、DELETEなどの最も一般的なSQL文を含み、データベースのテーブルからレコードの結果セットを要求したり(select)、データベース内のデータを追加したり(insert)、削除したり、変更したり(update)する際に使用されます。

攻撃者がDMLタイプのSQLインジェクションを使用してデータベースを操作すると、情報セキュリティにおける3つの保護目標のうち、機密性(...)&完全性(更新)(データを読むことを許可された人だけが読める)に違反することになります。

DMLコマンドは、データの保存、取得、修正、削除に使用されます。
SELECT - データベースからデータを取り出す
INSERT - テーブルにデータを挿入する
UPDATE - テーブル内の既存のデータを更新する
DELETE - データベースのテーブルからすべてのレコードを削除する

例:データを取得する。

SELECT phone FROM employees WHERE userid = 96134;

このステートメントは、ユーザIDが96134の従業員の電話番号を配信します。 www.DeepL.com/Translator(無料版)で翻訳しました。

It is your turn!

Tobi Barnettの部署を「Sales」に変更してみてください。

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

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

No.4 Data Definition Language (DDL)

データ定義言語には、データ構造を定義するためのコマンドが含まれており、特にデータベース内にどのようにデータを配置すべきかを示すデータベーススキーマを定義することができます。
攻撃者がDDLタイプのSQLインジェクションを使用してデータベースを操作すると、情報セキュリティにおける3つの保護目標のうち、次の項目に違反することになります:整合性(変更)、可用性(削除)。(データを変更/削除することを許可された人だけがそれを行うことができます)。 DDLコマンドは、データベースオブジェクトの構造を作成、変更、削除するために使用されます。
CREATE - データベースとそのオブジェクト(テーブル、ビュー、...)を作成します。
ALTER - 既存のデータベースの構造を変更します。
DROP - データベースからオブジェクトを削除する

CREATE TABLE employees(
    userid varchar(6) not null primary key,
    first_name varchar(20),
    last_name varchar(20),
    department varchar(20),
    salary varchar(10),
    auth_tan varchar(6)
);
この記述により、最初の「Employees」表が作成されます。

ここで、テーブル "employees "にカラム "phone"(varchar(20))を追加して、スキームを変更してみましょう。

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

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

No.5 Data Control Language (DCL)

データ制御言語は、ユーザーがデータベースにアクセスしたり操作したりするための特権を作成するために使用されます。
攻撃者がDCLタイプのSQLインジェクションを使用してデータベースを操作した場合、情報セキュリティにおける3つの保護目標のうち、次の項目に違反することになります:機密性(付与)&可用性(取り消し)(不要な人が自分に管理者権限を付与したり、管理者から管理者権限を取り消したりする可能性があります)。

DCLコマンドは、データベースオブジェクトにセキュリティを提供するために使用されます。
GRANT - ユーザーにデータベースへのアクセス権限を与える。
REVOKE - GRANTコマンドで与えられたユーザーのアクセス権限を取り消す
www.DeepL.com/Translator(無料版)で翻訳しました。

GRANT CREATE TABLE
TO operator;

ユーザーグループ "UnauthorizedUser "にテーブルを変更する権利を与えてみてください。
f:id:hirose-test:20210401210728j:plain

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

No6 What is SQL injection?

SQLインジェクションとは何ですか?
SQLインジェクションは、最も一般的なウェブハッキング技術です。SQLインジェクション攻撃は、クライアントからアプリケーションに入力されるSQLクエリを介して、悪意のあるコードを挿入または「注入」するものです。正しく対処しないと、このようなコードのアプリケーションへの注入は、データの整合性やセキュリティなどに深刻な影響を与える可能性があります。
SQL インジェクションは、クライアントからのフィルタリングされていないデータ(検索フィールドの入力など)が、アプリケーション自体の SQL インタープリタに入ることで発生します。クライアントからの入力にSQLコマンドが含まれているかどうかがチェックされなければ、ハッカーは簡単に基礎となるSQL文を操作することができ、自分に有利になります。 例えば、--(行の残りの部分をコメントアウトする)や ;(SQLクエリを終了させ、その方法でSQLクエリを連鎖させることができる)のようなSQLメタキャラクタが入力されているかどうかをフィルタリングしない場合です。

Example of SQL injection

入力フィールドにユーザー名を入力することで、ユーザー情報を表示することができるWebアプリケーションを考えてみましょう。
入力された情報はサーバーに送信され、SQLクエリに挿入され、SQLインタープリタによって処理されます。
データベースからユーザー情報を取得するためのSQLクエリは次のようになります。
www.DeepL.com/Translator(無料版)で翻訳しました。

"SELECT * FROM users WHERE name = '" + userName + "'";

変数 userName は、クライアントからの入力を保持し、それをクエリに「注入」します。 入力がSmithの場合、クエリは次のようになります。

"SELECT * FROM users WHERE name = 'Smith'";

と入力すると、Smithという名前のユーザーのすべてのデータが取得されます。
しかし、攻撃者がSQLクエリの一部である可能性のある予期しない入力を提供した場合、クエリ自体が変更され、データベースに対して他の(悪意のある)アクションを実行するために使用される可能性があります。
ここに入力フィールドがあります。ここに何らかのSQLを入力してみると、クエリがどのように変化するかがよくわかります。

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

以下は、ハッカーが入力フィールドに供給して、一人のユーザーのデータを読み取るだけではない、データベースに対するアクションを実行する例です。

  • Smith’ OR '1' = '1
    results in SELECT * FROM users WHERE name = 'Smith' OR TRUE; and that way will return all entries from the users table

  • Smith’ OR 1 = 1; --
    results in SELECT * FROM users WHERE name = 'Smith' OR TRUE;--'; and that way will return all entries from the users table

  • Smith’; DROP TABLE users; TRUNCATE audit_log; --
    chains multiple SQL-Commands and deletes the USERS table as well as entries from the audit_log

No.7 SQLインジェクションの影響

SQLインジェクションが成功すると、以下のことが可能になります。
* データベースの機密データの読み取りと変更
* データベースの管理操作の実行
・監査またはDBMSのシャットダウン
・テーブルやログの切り捨て
・ユーザーの追加
* DBMSファイルシステム上に存在する特定のファイルの内容の回復
* オペレーティングシステムへのコマンド発行

SQLインジェクション攻撃では、攻撃者は以下のことができます。
  • IDの偽装
  • 既存のデータを改ざんする
  • 取引の無効化や残高の変更などの否認問題の発生
  • システム上のすべてのデータを完全に開示させる
  • データを破壊したり、利用できないようにする
  • データベースサーバの管理者になる

No.8 SQLインジェクションの深刻度

SQLインジェクション攻撃の深刻度は、以下によって制限されます。
  • 攻撃者のスキルと想像力
  • ディフェンス・イン・デプス対策
    ・入力検証
    ・最小限の特権
  • データベース技術
すべてのデータベースがコマンドチェインに対応しているわけではない
SQLインジェクションは、PHP、Classic ASP、Cold Fusionや古い言語でよく見られます。
  • パラメタライズドクエリをサポートしていない言語
  • 新しいバージョンではパラメータ化されたクエリが追加されている
  • Webテクノロジーアーリーアダプター(=オールドコード)
すべてのデータベースが同じではない(SQL Server)
  • コマンドシェル: master.dbo.xp_cmdshell 'cmd.exe dir c:'
  • レジストリコマンド: xp_regread, xp_regdeletekey, ...

www.DeepL.com/Translator(無料版)で翻訳しました。

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