katagaitai勉強会#6-関西easyに参加しました.
— る (@yue_roo) 2016年8月13日
当日の資料は公開されているようなのですが,私が初めて知ったこと等を中心にWriteUp書いてみます.
Web
@yagihashooさんの資料はこちら
katagaitai勉強会#6 EasyなWeb編 / katagaitaiCTF#6 Web // Speaker Deck
問題のページ
https://wildwildweb.fluxfingers.net:1401
証明書関係の問題でFireFoxでは開けず,慣れないchromeで進める. ログインすると牛の出会い系(?)チャットサイトなのでセクシーな牛の写真がたくさん.
X-Forwarded-For
問題の報告を送る部分は,同一IPアドレスからは3分に1回しか送れない.
プロキシを挟んでX-Forwarded-Forヘッダを付け加え,送信元IPを適当に変える.
Fiddlerだとこんな感じ.
.git
/.git
を見るとIndex Ofのやつが見える.
wget
で取ってきてgit reset --hard
するとソースを復元できる.
$ wget -r --no-check-certificate -erobots=off https://wildwildweb.fluxfingers.net:1401/.git/ $ git reset --hard $ ls api/ cfg.php* css/ index.html index.php* js/ lib/ robots.txt* static/ templates/
ソースコード
FLAG
という文字列がある.
grep -e FLAG `find . -name '*.php'` ./api/premium.php: $message = 'PREM_' . FLAG; ./cfg.php:/* Example configuration. Please change FLAG, SALT and the database credentials. ./cfg.php:define('FLAG', 'XXX');
?api=premium.php
との通信でmessage
が帰ってきているので,プレミアム会員としログインしているとフラグが見られるらしい雰囲気.
プレミアム会員になるにはメールを送ってね,とあるが素直に送っても無理そう.
変数の使い回し
/js/pages/chat.js
でtemp
という変数が使い回されている.
しかもvar
が使われていない.
temp
に入ったテンプレートにtemp.assign()
して色々要素を渡しているらしい.
インスペクタでtemp
を追うと,最初はlocation
, 165行目のtemp = new Template('message.html');
でTemplate
に変わる.location.hash
には#Rosie
が入っている.
XSS可能な場所を探す
https://public-firing-range.appspot.com/
googleが出しているXSSのパターン集らしい.いいものを知った.
location.hash
Rosieちゃん(牛)のチャットページのURLhttps://wildwildweb.fluxfingers.net:1401/?p=chat#Rosie
となっている.
URLのユーザ名部分を変えるとページ内容に反映される.タグも使えたりする.
しかし<img src=x onerror="alert("XSS");">
等が動かない.これはContent Security Policy(CSP)のため.
+ Content Security Policy
同一生成元ポリシーの強化版みたいなやつ.
実行可能なスクリプトの条件をヘッダで指定してブラウザに伝えることができる,と理解した.
これによりXSSは難しそう.しかし,DOM Clobberingは可能である.
DOM Clobbering
DOMの要素は上書きできる.
例えば<form name='getElementById'></form>
とするとdocument.getElementById()
が上書きされてしまう.
これを使うとdocument.getElementById()
が実行された時にエラーを起こすことができる.
最終的にやること
- プレミアム会員であると思われるadminユーザに,チャットページにアクセスさせる.
そのために問題報告ページから報告を送る. - チャットページのアクセスしようとするときに,
temp
に別のアクセス先が入っている状態にする.- adminユーザは報告メールのユーザ名欄にある名前を
location.hash
に入れている. temp = new Template()
で上書きされる前にエラーを起こし,location.hash
に飛ばす.
- adminユーザは報告メールのユーザ名欄にある名前を
- 別のアクセス先に,フラグの入った
message
付きのアクセスがあるはず.
そのために問題報告ページのユーザ名(cow name)に入れるべき文字列が以下のとおり.
別アクセス先URL<form name='getElementById'></form>
- 別のアクセス先
適当なサーバでnc -l
するか,RequestBinというのが便利だそう.
RequestBin — Collect, inspect and debug HTTP requests and webhooks
結果
できてないんですよね・・・_(:3 」∠)_
RequestBinにアクセスが来てないです.
原因がちょっとわからないんですが,とりあえずここまでとします.
考え違いとかtypoとか何かあったらぜひ教えて下さい.
そして長くなったのでReversingは次の記事に回します.
[追記]Reversing編書きました.