2017年4月29日土曜日

ctf Simple Auth IIの解答をトレースしてみた writeup

SQLインジェクションの問題を解きたく、この問題にチャレンジ。
が結果的にはSQLインジェクションとはそもそも関係なさそう。

今回は、他サイトの解法をそのままトレースすることにした。

参考サイト

http://imoimo.hatenadiary.com/entry/2016/06/24/175733

http://timeislong.hatenablog.com/entry/2016/07/13/183000


https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10138372915
開放の考え方が参考になる。

FLAGゲットをするストーリーとしては
データベースの中身からFLAGを探す
じゃあデータベースをみるには?
ー>ダウンロードを試みる
ーー>どうやってダウンロードする??
ーーーー>しかし、webアドレスの一部を変えてダウンロードできるっていう考えがなかなかたどりつかない。
これはなれるしかないか?

1.
http://ksnctf.sweetduet.info/problem/35

内の2つのサイトを開く

2.


http://ctfq.sweetduet.info:10080/~q35/auth.php

http://ctfq.sweetduet.info:10080/~q35/database.db
として実行
ー>
database.dbがダウンロード

3.database.dbに対してsqlite3コマンドを実行
ー>その後selectコマンドでフラグをゲット

ctf4b@ctf4b-vm:~$ pwd
/home/ctf4b
tf4b@ctf4b-vm:~$ cd Downloads/
ctf4b@ctf4b-vm:~/Downloads$ ls
database.db
ctf4b@ctf4b-vm:~/Downloads$ ls -l
合計 4
-rw-rw-r-- 1 ctf4b ctf4b 2048  4月 29 21:01 database.db
ctf4b@ctf4b-vm:~/Downloads$
ctf4b@ctf4b-vm:~/Downloads$ sqlite3 database.db
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> select * from user;
root|FLAG_iySDmApNegJvwmxN
sqlite>


問題は一応とけた。だが疑問点あり

疑問

sourceの中からどうしてdatabase.dbにそもそも着目できる??
source部分には、database.dbは以下の1箇所。
推測:database.db前後の以下の式は、id,pwを入力すると直接実行されるSQL文ということか?
------

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;
}
------

sqlite3とはそもそも何か?
SQLiteのデータベースを操作するためのコマンド

https://hydrocul.github.io/wiki/commands/sqlite.html

上記で実施した
sqlite3 database.db
とは
sqlite3 データベース名
でデータベースへ接続するコマンドを実行していることを意味する。

そこからselectでデータベースの中身を調べてFLAGを探す
今回はselect * from user;
でflagをget
これはselect * from user;自体はもはや決まり文句のようなコマンド?

もしくはsource内のSELECT * FROM userを参考にしたか??
PHPあたりを勉強するともっとわかるのだろうか??