CTF Writeup: Country DB - AlpacaHack
添付されているファイルを展開すると、2つのPythonファイルが目につきます。
app.py: JSONを受け取ってSQLiteデータベースからデータを取ってくるサーバのようです
init_db.py: データベースを初期化するスクリプトのようで、ここにフラグがどこにあるかの記述もあります
app.pyでは{"code":...}という形式のJSONを受け取り、codeフィールドをクエリに使っています。
SQLインジェクションをしたいので、len(code) != 2 or "'" in codeを掻い潜る方法を探します。
💡codeは別に文字列でなくても、配列なんかでも良いことに気づきます。
例えば、[1, "hello"]などを指定してもチェックをすり抜けることができます。
この文字列はクエリに展開されると、SELECT name FROM country WHERE code=UPPER('[1,'hello']')となります。
ではこれをうまく使ってフラグを得たいところですが、困ったことにフラグはcountryテーブルではなくflagテーブルにあります。
💡UNIONを使って別のクエリの結果を結合しましょう。さらに、flagをnameと銘打って出力に入るようにしてしまいます。
SELECT name FROM country WHERE code=UPPER('[1,') UNION SELECT flag AS name FROM flag --']
このようにすることで、最初のクエリでは該当する結果がなく空、次のクエリではフラグが得られるため、結合した結果はフラグになります。