
【第1回】CTFをやってみる ksnctf
こんにちは。ゆーろんです。 記録がてら、CTFの備忘録をぼちぼち書いていきます。 ぼちぼち解くことを目指すので複数日またぐこともあると思いますが、よろしくお願いします。
目次 問題 解いてみる 1日目 2日目 感想 問題 国内では有名な ksnctf です。 今回の問題は以下です。
Login - ksnctf http://ctfq.u1tramarine.blue/q6/ https://ctfq.u1tramarine.blue/q6/ http://ctfq.u1tramarine.blue/q6/ https://ctfq.u1tramarine.blue/q6/ ログインフォームのURLが2つ与えられています。
ここからFLAGの文字列をどうにかして取得するということです。
解いてみる 1日目 まず入力フォームといえばSQLインジェクションが思い浮かびます。
ということで定番の” or 1=1 —を入れてみます。
以下のように表示されます。
上記コードから2点の脆弱性が確認できます。
パスワードが平文で保存されている プリペアドステートメントが実装されていない またコードからはidパラメータ入力においてSQLの条件文を満たせば写真ページが表示されることがわかります。 つまり直接パスワード自体をSQLでそのまま直接取得して表示することは厳しそうです。
2日目 SQLインジェクションにはいくつか種類があるようです。
HTTPレスポンス/リクエストなどを見た限り特に何もないようなので ここでSQLインジェクションを深めます。
インバウンドSQLインジェクション エラーベースSQLインジェクション UNIONSインジェクション ブラインドSQLインジェクション マルチブルステートメント 調べる限り、ブラインドSQLインジェクションという手法が怪しそうでした。
ブラインドSQLインジェクション
Webサーバへ何種類かまたは複数のデータを送信した際のレスポンスや動作からデータベースの情報を分析する手法
ブルートフォースでやみくもにFLAG_hogehoge…と総当たりするのも大変なのでパスワードの断片情報から求めます。
まずパスワードの文字数を求めてみます。
SELECT * FROM user WHERE id="" or (SELECT length(pass) FROM user WHERE id = "admin") > 30 -- $id" AND pass="$pass" 上記のSQLとなるようにひたすらフォームに入力して調べ、Congratulationsとページが出るところを探します。