【CTF】サーバをハックする〜Simple Auth IIとSQLiteと〜
いきさつ
セキュリティの勉強も兼ねてCTFの問題を解いてみた。
サーバをハックするより前にソースコードが見えているので
ハックするような大したことはしていない。
問題
20ptなので超簡単ということだが。。。?
考えたこと
ログイン画面
適当なID&パスワードを入れ、ログインしてみる。
ソースコード
<?php function h($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); } if (!isset($_POST['id']) or !is_string($_POST['id'])) $_POST['id'] = ''; if (!isset($_POST['password']) or !is_string($_POST['password'])) $_POST['password'] = ''; $try = false; $ok = false; if ($_POST['id']!=='' or $_POST['password']!=='') { $try = true; $db = new PDO('sqlite:database.db'); $s = $db->prepare('SELECT * FROM user WHERE id=? AND password=?'); $s->execute(array($_POST['id'], $_POST['password'])); $ok = $s->fetch() !== false; }
postされたidとpasswordでuserテーブルを検索、
該当レコードが存在する場合はログイン成功ということらしい。
SQLインジェクション使える?→使えないよね
プリペアドステートメントを使用しているので、
execute内に渡された値はエスケープされる。
この時点で
やれることがなくなってしまった。。。
ググる
この記事をみると、
「ダウンロード」という言葉がある。
どういうこと?
SQLiteについて調べる
どうやらSQLiteのDB情報は、
****.dbというファイル形式で保存されるらしい。
そして、
<?php //... $db = new PDO('sqlite:database.db');
このsqliteの後で指定されているのはDBのファイルで、
相対パス指定されているということらしい。
DBファイルをダウンロード
sourceのurlのauth.phpの部分を、database.dbに変えるとDBファイルがダウンロードできる。
(普通じゃ考えられないけど)
SQLiteで読み込む
$ sqlite3 ~/Downloads/database.db sqlite>
適当なsqlを発行
phpソースコードから、userテーブルが有ることがわかっているので、
selectで全部持ってくる。
sqlite> select * from user; root|FLAG_****
でてきた。
まとめ
この手の問題を特には様々な知識が求められる。
今回で言えば、
SQLiteの接続方法
プリペアドステートメント
SQLインジェクション(使わなかったけど)
などなど。
なかなか勉強になった。