やぎはしゅです。
電通インターンのバックドア選考なるもののWrite-upです。
初心者なのでセキュリティとかハッキングとか全然わからないしコードも書けないしただのクソ雑魚なのですが頑張って書いたので読んでいってください!
ちなみに、一番最初に突破していた@akiymが既にいい感じに綺麗なWrite-upをまとめています。
[Perl] 電通 web100 writeup – Pastebin.com
僕のは悪手だし汚いんですが、泥臭いのもたまには必要かなーと思って書き残しておきます。
ちなみに2番目でした。悔しい(´・ω・`)
とりあえずフォームを見た瞬間お決まりのシングルクォーテーションです。
んで、まぁ、お決まりのエラーメッセージが出てるので、あとは普通にUNION SELECTするだけなんですが、この画面でやるのも面倒なのでXHRでGETしてる先に直接アクセスします。
http://bit.ly/1pfHiQ7
ちなみにクエリ中のスペースは全てストリップされるようになっているので、いつもの感じでUNION SELECT ~~~とかしてもあかんです。
かと言ってスペースがないとvalidなSQL文にならないので、スペース相当の部分に/**/でコメントを挟んであげるとうまく通ります。
このテクニックそのものはスペースが通らないページでのXSSでも使うごく一般的なもので、たぶん皆さんご存知だと思いますが、一応。
先のエラーから元のクエリではLIMIT 1000しているのはわかっていたのですが、どうやらアプリケーション側でも1000件しか参照しないようになっているらしく、上記画像の状態だとtable00001からtable01000までしか取得できていません。
適当にOFFSETしてあげれば全件取得できます。
ちなみにtable[0-9]{5}なテーブルの中の対応する各カラムの値を見てみるとこんな感じになります。
こんな感じのが19999個あります。
http://bit.ly/1pIjO9K
なんかURLが出ていて、表側の問題を見る限りはこんな感じで取得できるURLのうちのどれかが正解のURLっぽいです。
というわけでとりあえずこの結果を全て取得してくるスクリプトを書くわけです。
が、おそらくアプリケーション側でsleepしていると思うのですが、各結果の取得に1sec程度かかるようになっています。
約20000秒かかるわけですから待ってられねーよってことで、某氏に提案されたUNION SELECT連結案を採択。
最初に悪手って述べたんですけど、何が悪手って1つのスクリプトで全部するのが面倒で、phpで書いたり、pythonで書いたり、シェルでちゃちゃっとやったりしてるので、まとめるのがすげー面倒くさいあたりなんですけど、とりあえずまとめるとこんな感じ。
他にもシェルでやっちゃったりした作業があるのですが面倒なので割愛。
https://gist.github.com/yagihashoo/786acba2bac779a87000
事前にcurlで19999件の結果を取得しておいて、適当にtable名とcolumn名の組み合わせだけ抽出して、それを使ってget_url_obj.pyでさらに各table内のURLっぽいobjを取ってきて、ext_url.phpでURLだけ抽出してurls.txtにしてます。
んでまぁ、どっかで何か間違えたっぽくて何件か取得できてないんですけど、結果がこんな感じ。
https://gist.github.com/yagihashoo/f365b446cc33fd3438af
んで、ずーっと見ていくと@akiym曰く「自明な」URLがあるので、それが答え。
https://gist.github.com/yagihashoo/f365b446cc33fd3438af#file-urls-txt-L11237
なんかヒントとかあったらしいけど、わかんねーよwww
つーわけで、ざっくりとした感想としては、この手の企画にありがちな残念なものではなくて、割とまともなSQLiを取り扱っていて、電通さんすごいなーという感じ。
僕自身に対する感想を述べると、深夜で頭が回ってないのもあったけど遅すぎかなぁ…。
@akiymもどこかで言っていたけどこれくらいなら30分くらいでできるようにならないとまずい気がするので精進します…。
せっかくだしインターン応募しようかと思ったけど残念ながら8月30日は参加できないので条件満たせず…。
追記 [6/19 4:18]
table[0-9]{5}で各テーブルにカラムがひとつしかないのがわかった時点でだいぶ手間が省けることに後になって気づいたので改善版のスクリプト。https://gist.github.com/yagihashoo/eb005af48aaf5a7b439c