hack the box ~魔法使いへの道~ (その19) DEATH NOTEで学ぶUNIONの使い方【SQL】SQLインジェクションで必須

htb

はじめに

前回,HTBでUnderConstructionをやっていたところ,SQLのUNIONで躓いてしまい今回はその使い方をやっていきます.

hack the box ~魔法使いへの道~ (その17) Under Construction(前編)
今回はBeginner TrackのUnder Constructionを参考に攻略していきたいと思います.

UNIONとは

UNIONは二つ以上のSELECTの結果を、統合して表示してくれる仕組みです.
イメージとしては和集合が近いです.

SQLインジェクションにおけるUNIONの必要性

SQLインジェクションでは下記のコードのように,「username」に対応した入力で攻撃します.

#HTBのUnderConstructionのコードです

    checkUser(username){
        return new Promise((res, rej) => {
            db.get(`SELECT * FROM users WHERE username = ?`, username, (err, data) => {
                if (err) return rej();
                res(data === undefined);
            });
        });
    },

そのため,参照するテーブル名(この例ではusers)を攻撃側は指定できません.そこで,UNIONを使うことで,別のテーブルを今のテーブルに結合することで,必要な情報を集める仕組みです.

使用するテーブル

今回はデスノートのキャラクターを使用してUNIONの動きを見ていきます.
まずは,シーズン1,2で登場するキャラクターの一覧を格納した「Character」テーブルがあるとします.

これに対して,シーズン1で登場するキャラクターのテーブルを下記に示します.

また,シーズン2に登場するキャラクターのテーブルを下記に示します.

これで準備は完了です.

UNIONを使ってみる

実際にUNIONしてみましょう

SELECT  characterId  FROM  Season1
UNION
SELECT  characterId  FROM  Season2;

これで,シーズン1とシーズン2のテーブルが結合され,下記のようなテーブルが出力されます.
ただし,重複していたものは1つにまとめられます.

UNION ALLを使ってみる

UNION ALLでは,重複されたものも出てきます.

SELECT  characterId  FROM  Season1
UNION ALL
SELECT  characterId  FROM  Season2;

おわりに

以上で,UNIONの説明は終わりです.
SQLインジェクションを使う上で使うときがありますので,これを機に少しでも理解が深まって頂ければ幸いです.

コメント

タイトルとURLをコピーしました