ボーナス問題以外が解けて嬉しかったので調子に乗って書いてみる。
スクリーンショットとか撮ってなかったので文字で書くだけ。
3dub (web-based challenges) 1 – badmedicine –
適当にユーザ名を入れてログインボタンを押すと/welcomeに飛ばされてログイン成功と出るが、keyはadminだけよと言われる。
そこでユーザ名にadminと入れてログインボタンを押すと、adminではログインできませんと出る。
admin以外のユーザ名を入れてログイン成功した場合、Cookieがセットされる。
見てみると、username=xxxxxxxxとなっており、xxxxxxxxの部分には入力したユーザ名の文字数x2文字の文字列が入っており、2文字でユーザ名1文字分に対応していると推測できる。
ユーザ名をいろいろと変えてやってみると、ユーザ名のn文字目とxxxxxxxxの対応する部分の対応ルールは固定であることがわかるので、一度ユーザ名をadminiにしてログインボタンを押した後、Cookieのusernameの部分の後ろ2文字を削って(‘admin’に対応する文字列にして)から/welcomeに移動するとadminでログインしたことになり、keyが表示される。
3dub (web-based challenges) 2 – babysfirst –
適当にusernameとpasswordを入れてログインボタンを押すとログインに失敗する。
レスポンスヘッダを見てみると、X-Sqlというヘッダがあり、SQL文が書いてあった。
X-Sql: select username from users where username='xxx' and password='yyy' limit 1;
はい、というわけでSQLインジェクションですね。
usernameに
' or 1=1;--
などと入れると、rootとしてログインしましたと出るもののkeyは出ない。
ではrootのパスワードにkeyがあるだろうと思いusernameを
' union select password from users where username='root';--
としてみても「残念。それは違う」と出る。
usersテーブルにはもう1レコード(username=user)あったが、そちらのパスワードでもない。
ではusersテーブルの別フィールドか別テーブルにあるだろうと推測。
いろいろ試したところ、DBはSQLite3であることが判明したので、以下のusernameでテーブル構造を取得。
' union select sql from sql_master where type='table' and name='users';--
usernameとpasswordしかフィールドがなかったので、別テーブルを捜索すると、keysというテーブルがあったので、usernameを
' union select value from keys;--
としてkeyを取得。
OMGACM (guerilla programming) 1 – pieceofeight –
指定されたホストにtelnetで接続すると、8パズルの盤面が送られてくる。
送信した文字により盤面が変化する。
- l – 空きスペースの左の数字が右に移動する
- r – 空きスペースの右の数字が左に移動する
- u – 空きスペースの上の数字が下に移動する
- d – 空きスペースの下の数字が上に移動する
この4文字から成るシーケンスを送って8パズルを解く。
解けると次の問題が送られてくる。
これを繰り返して50問解くとkeyが送られてくるが、時間制限があり、解答に時間がかかると怒られて接続を切断されてしまうので、アルゴリズムのスピード勝負。
A*法で解くプログラムを自作しようかと一時は思ったが、自分の場合ひどく時間がかかることが予見されたので、ぐぐって出てきたこちらのサイトにあるコードを使わせてもらった。
出てきた問題をひたすら解かせて50問解いてkeyを取得。
OMGACM (guerilla programming) 5
hack the planet!