exits

勉強記録

katagaitai勉強会#6-関西easy WriteUp(1) - Web

katagaitai勉強会#6-関西easyに参加しました.

当日の資料は公開されているようなのですが,私が初めて知ったこと等を中心に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だとこんな感じ.
f:id:yue82:20160815022320p:plain:w300

.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が帰ってきているので,プレミアム会員としログインしているとフラグが見られるらしい雰囲気. f:id:yue82:20160815024514p:plain:w300
プレミアム会員になるにはメールを送ってね,とあるが素直に送っても無理そう.

変数の使い回し

/js/pages/chat.jstempという変数が使い回されている. しかも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に飛ばす.
  • 別のアクセス先に,フラグの入ったmessage付きのアクセスがあるはず.

そのために問題報告ページのユーザ名(cow name)に入れるべき文字列が以下のとおり.

別アクセス先URL<form name='getElementById'></form>

結果

できてないんですよね・・・_(:3 」∠)_
RequestBinにアクセスが来てないです.
原因がちょっとわからないんですが,とりあえずここまでとします.
考え違いとかtypoとか何かあったらぜひ教えて下さい.

そして長くなったのでReversingは次の記事に回します.

[追記]Reversing編書きました.