Google CTF BNV解いてみた

先日開催されたGoogle CTFに参加しました。そこで、一問でも解きたいと思って、解けないか粘っていたWeb問のBNVをWriteupみながら解いてみたのでその履歴を記事にします。人に見られるようとよりか、自分用のまとめなので悪しからず。

今回参考にさせていただいたWriteupはこちらです。[GoogleCTF2019] - Web:BNV - Writeup

CTF終了時点からこの問題のWriteup探してたのですが、中々公開されなくて数日たちようやくこのブログが公開されました…待ってましたw

さて、作業履歴を書いていきましょう。

今回のBNVという問題は都市の名前を選択すると、それに対応する説明が返ってくるという単純なWebサイトです。入力する値はリストとして用意されている都市だけなのでテキストボックスとかもありません。

初めはSQLiとかの単純な攻撃かと思ったのですが、開発者ツールで書き換えて送信するとアルファベット以外は正常に通信が出来ませんでした。 パケットを確認すると、通信する際に都市の名前をそのまま送るのではなくJSで暗号化みたいな事をしているのでそこをいじるのかなと思い暗号化のコードを見たりしたのですが、怪しい部分は特に見当たりませんでした。そのためWebサーバ側の実装が問題なのではないかと考え色々とやってみると、暗号化した後の値を復号する際とかに全部がそのまま検索とかに使われるのではなさそうなのでそこかと思ったのですが全く違いましたね…悲し…(/ _ ; )
まぁ、こんな感じで色々と迷走しながらやっていたのですがこの辺りで色々と試してもこの先に進みそうに無かったのでこの辺りで諦めました。

さて、Writeup見ながらやっていきましょう。今回しようするWriteupははじめにあげたこちらです。[GoogleCTF2019] - Web:BNV - Writeup

要約すると今回の攻撃手法はdtdファイルを使ってのXXEらしいです。僕は今回初めてちゃんとXXEを勉強したのでググりながらWriteup見ていきました。 勉強に使ったサイトはこちらのサイトです。PORTSWIGGER XXEinjection

今回はXXEでもblind XXEの手法を使うようなのでPORTSWIGGERの中のこちらでまた勉強しましたPORTSWIGGER Blind XXEinjection 今回は、dtdを使うとの事なので主に「Locating an existing DTD file to repurpose」が勉強になりました。

「Locating an existing DTD file to repurpose」のコードを利用して攻撃をするとそれだけではうまくいかずWriteupを確認するとContent-type:application/jsonで送られているが、これをxmlにするとxmlに強制できるという脆弱性があるらしくこちらを変えてやると攻撃が成功した。この後、アクセスする先を/flagにしてやるとflagが出力された。

大体この流れでとりあえずこの問題は試せました、この記事を参考にするより本記事のWriteupを参考にした方がはるかにいいのでそちらを見てくださいww