SECCON Beginnersに参加した
結果
4問解けた
Reversingはバイナリ解析ソフトをインストールする気力がなかったし、Pwnは未知の領域なのでできない
以下、各問題の解き方
[Warmup] Greeting
こんな感じのページがでてくる
サーバは下のPHPコードに沿って動いてるようなのでこのコードの脆弱性を突きたい
htmlタグに入った時点で$usernameの値が"admin"じゃないとflagを表示してくれないので、それより上で$usernameの値を設定したい
ページ上のフォームによるPOST送信で値を"admin"に設定しようとすると"偽管理者"になってしまうのでダメ
他の設定方法を探す
よく見るとPOST送信をしないときは、$usernameをcookieから取得しているみたい
この場合は"admin"に設定しても"偽管理者"になることはない
cookieをつくろう
適当なcookie管理アドオンなどを導入したあと、サーバが作ってくれたcookieを書き換える
値をname=adminに設定し、有効期限をいい感じに延ばせばよい
あとはPOST送信をしないでページを閲覧すればいいので、F5を押してページを更新するとフラグが出てくる
[Warmup] Veni, vidi, vici
タイトルの元ネタはカエサル(シーザー)
シーザー暗号を使いそう
(それぞれの文字を決まった数だけずらすやつ、3つずらすならA→D,B→E,C→F,D→Gといったように)
3つのファイルが渡される
1つめと2つめはアルファベットの部分をシーザー暗号で戻す
3つめは180度回転したような文字が書かれているので頑張って読む
3つのファイルのフラグの情報をつなげればフラグが復元できる
[Warmup] Welcome
ルールに載っている公式IRCチャンネルに入るとフラグを教えてくれる
Gimme your comment
とある架空webサービスのURLが与えられる
記事を打ち込むと向こうの社員がブラウザで閲覧してコメントをつけてくれるので、社員が使っているブラウザの種類を特定しようという問題
本文に <script>alert();</script> と打ち込むとアラートがでた
これは、入力された文字列をそのままページに入れ込むと、ブラウザがその文字列をHTMLコードの一部と勘違いして、<script>タグ内部のjavascriptを実行してしまうことで起きる現象(やばい)
社員が使っているブラウザでも同じことが起きてるみたいなので、これを利用して種類を特定する
javascriptの仕様をググってみると、window.navigator.userAgent がブラウザの名前を保持しているらしい
相手のこの値を僕に伝えてくれればいいので、どうやって僕に送るか考える
送り方
①僕が保有しているサーバに何らかのメッセージを送る
僕のサーバがwebサーバのときで、相手のブラウザを僕のwebページに遷移させることをXSS(クロスサイトスクリプティング)という らしい
②このサービスを直接利用して僕のブラウザにメッセージを送る
①と②を比べると、②のほうが圧倒的に楽なので②を使いたい
もしこのサービスが他者のwindow.navigator.userAgentのような値を表示することを禁止していると、①を使うしかないけど、ひとまずやってみよう
このようなコードを送った
getElementsByClassNameでほしいHTML要素のクラスを指定していい感じに操作をさせる
window.onloadは、値として入れられた関数を、ページをすべて読み終わった後に実行する変数らしく、これを追加しないと、このスクリプトが読み込まれた以前のHTML要素しか扱えない。今回扱いたいinputとbuttonは、HTMLコード上ではスクリプトの後に配置されるので、window.onloadの部分は必要になる
結果はこう
僕も巻き添えを食らったけどflagがゲットできた
ページを閉じない限り止まらないので、スクショを撮って手で打ち込んだ