picoCTF 2023 - More SQLi

WriteUp: picoCTF 2023 - More SQLi

はじめに

こんにちは。CTF初心者のロイといいます。
今回はpicoCTFのMore SQLi(Medium, Web Exploitation)を解いたので、WriteUpを残しておきます。
解法だけでなく、なるべく思考の過程を残したいと思っていますので、ご参考になれば幸いです。

問題概要

Descriptionによると「このWebサイト上でFlagをみつけられるかな?」といった感じです。

challenge instanceを立ち上げて、リンクをブラウザで開いてみると、こんな感じです。
picoCTF MoreSQLi

SQLインジェクションを使うのはわかりますが、どう攻めましょうか。

まずはなんか入れてみる

まずはなんか入れてボタン押してみるしかないか。

Usernameにhoge、Passwordにhugaを入れてLog inボタンを押してみる。

すると、以下のような画面が表示されました。

picoCTF MoreSQLi Details

ご丁寧にSQLクエリが表示されました。

SQLインジェクションとは?

SQLインジェクションとは、SQL文を操作してデータベースに不正なクエリを実行させて、データを抜き取る攻撃です。

さきほどのSQLクエリをみたところ、下記のSQLインジェクションの例でよくみるやーつが使えそうですね。

' OR '1'='1' --

これをPasswordに入れたら、SQLクエリが下記ようになるはず。

SELECT id FROM users WHERE password = '' OR '1'='1' -- ' AND username = 'hoge'

実際にやってみると、SQLが正常に実行され、ログインできてしまいました。

picoCTF MoreSQLi Flag

これでSQLインジェクションによるログインは成功しました。

ヒントのSQLiLiteとは?

ログインはできましたが、flagは一体どこに?

ヒントのSQLiteについて調べます。
軽量でファイル形式であるのが特徴、標準のSQLが使える、データ型の指定が不要。。。
あんまりピンと来ないですねぇ。

データベースってスキーマやデータベース自体の情報を持った内部テーブルというのがあるはずなので、それを調べます。

SQLiteの内部テーブルは、sqlite_masterという名前で、スキーマやテーブルの情報が格納されているそうです。

CREATE TABLE sqlite_master(
      type text,
      name text,
      tbl_name text,
      rootpage integer,
      sql text
    );
    

どうにかして、sqlite_masterテーブルを参照できないか。

さきほどのSQLクエリをみると、SELECT文が使われているので、UNION SELECTを使って、sqlite_masterを参照できるかもしれません。

試しに、入力欄に以下のように入れて、Searchボタンを押してみます。

' UNION SELECT * FROM sqlite_master --

下記の画面のように、なにもとれません。。。

picoCTF MoreSQLi sqlitemaster01

よく画面をみると、City, Address, Phoneと3つのカラムなので、*ではなく3つカラムを指定しなきゃダメでした。(*だとsqlite_tableの全5カラム取ってきてUNIONできない)
こんな感じ

' UNION SELECT name, sql, tbl_name FROM sqlite_master --

すると、以下のような画面が表示されました。

picoCTF MoreSQLi sqlitemaster02

hintsテーブル、more_tableテーブルなどなど、各テーブルのCREATE文がみれましたね~。

flagを取得する

次は、flagが格納されているテーブルを探します。

さきほどの画面をみると、more_tableテーブルにflagカラムがあるようです。

では、more_tableテーブルのflagカラムを参照してみます。

' UNION SELECT 1, id, flag FROM more_table --

こちらを入力欄に入れて、Searchボタンを押します。

すると、以下のような画面が表示されました。

picoCTF MoreSQLi Flag

flagが表示されました!

TECH BLOG BY OZAKI