学内CTF writeup ～web編～

# 目次
1. hidden
2. cookie1
3. cookie2
4. directry_traversal 
5. SQL Injection 1
6. browsing
7. directry_traversal
## hidden
>セキプロのwebサイトのどこかにflagを隠しました。どこに隠したか分かるかな？
flagの形式はkitsec{}です。
セキプロwebサイト: https://www2.kanazawa-it.ac.jp/kitsec/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/58f0da8e-7d8b-0215-bf43-8ed0ef2ba0dd.png)

アクセスすると、セキプロのホームページにアクセスすることができました。他のページを見てみてもwebページ上では、特に何も表示されていません。

#### 解法
webサイトがどのように書かれているのかを確認するために、webサイトのソースコードを閲覧します。ソースコードの見方はさまざまですが、今回は`Ctrl+U`を押すことでソースコードを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/8ddefe1f-f5dd-456d-4cce-f9a531f79b82.png)

このような感じで、ソースコードが表示されます。どの部分にflagが書いてあるか探索すると、`活動内容 | /activity.html`のソースコードを見ると、コメントアウトされているflagを見つけられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/53b5789a-f701-98bd-a278-cdf4c15fbb28.png)

よってflagは`kitsec{hidden_flag_in_code}`になります

## cookie1
>このアプリケーションには、管理者だけがアクセスできる秘密のページがあるようです。
以下のwebページにアクセスしてFlagを見つけて下さい。
flagの形式はkitsec{}です
https://cookie1.kitsecprj.uk

webページにアクセスすると、ログインページが与えられます。しかし、UsernameとPasswordが分からないので、何も手が付けられません。適当なUsernameとPasswordを入力しても、以下のようなページになるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/58df3950-5f54-1091-f902-78dbfde83e7d.png)

adminの権限に昇格する手立てとして何があるだろうと考え、問題のタイトルにもなっている`cookie`に注目してみます。
cookieってなに？っていう人がいると思いますが簡単にいうと、サーバがユーザのウェブブラウザに送信する小さなデータのことです。webの第2回目の資料、もしくは以下のリンクを参照してください。
https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies
https://zenn.dev/collabostyle/articles/8949e8db686263

#### 解法
このwebサイトのcookieを画面を確認してみましょう。
chromeの場合cookieの見方は、以下の手順になります。
1. 右クリック
2. 検証をクリック
2. アプリケーションタブを見る
2. ストレージ -> Cookieを参照する

この手順でcookieを確認すると、`PHPSSID`と`is_Admin`というパラメータが見えることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/786d9709-1d1b-c7f7-249d-52c85772fe22.png)

`is_Admin`というパラメータに注目してみると、値が`False`になっていることが分かります。`is_Admin`のパラメータのTrue/Falseで判定してそうなので、ここを`True`にしてみるとどうなるでしょう。無事flagがゲットできました。
※ `is_Admin`のパラメータを`True`に書き換えた後、ページ自体をリロードすると変更が反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/c4a3e281-d0b6-86a4-4845-c67aa6bf3ff9.png)

flag : `kitsec{check_your_cookie_success}`

## cokkie2
> VIP専用コンテンツにアクセスし、隠されたFLAGを見つけ出してください。
flagの形式はkitsec{}です
https://cookie2.kitsecprj.uk/

webページにアクセスすると、ユーザ名のみ入力を求められます。今回もユーザ名が与えられていないので、適当なユーザを入力します。すると以下のような画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/192d7e47-31ad-e94a-d17f-bc581867d727.png)

今回も権限エラーのようです。
#### 解法
それでは今回も問題のタイトルとなっているcookieを見てみましょう。cookieを見てみると以下のようになっています。
cookieには`session`というパラメータが入っていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/052f163f-5ba7-8933-b550-7395f54ca2ef.png)

`session`というパラメータには`eyJ1c2VybmFtZSI6ICJoZWxsbyIsICJyb2xlIjogIm5vcm1hbCJ9IA==`が入っていることが分かります。これが怪しいなという検討を付けます。
base64で暗号化されたものの特徴として、末尾に`==`がつくという特性があります。
cyberchef (https://gchq.github.io/CyberChef/) を使ってbase64デコードをしてみましょう。デコードした結果が以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/c9047ba1-b5b0-c85a-9d9b-fca47d7de78e.png)

この結果からsessionには`{"username": "hello", "role": "normal"}`が格納されていることが分かりました。今回はwebサイトに最初にアクセスした際時、<strong>VIP専用コンテンツを閲覧する場合はログインして下さい</strong>という指示があるので、`role: "vip"`にしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/20614939-6444-a48f-2082-abdfd0a09b59.png)

するとbase64エンコードした結果が`eyJ1c2VybmFtZSI6ICJoZWxsbyIsICJyb2xlIjogInZpcCJ9`になります。
これを`session`に格納して再リロードすると、flagが出現しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/64b279eb-1e1b-b0aa-dd84-0b7b8c8919c9.png)

flag: `kitsec{check_cookie2_base64}`

## SQL Injection1
>ログイン画面を操作して管理者の権限を取得し、隠された情報（FLAG）を取得してください。
flagの形式はkitsec{}です
https://sqlin1.kitsecprj.uk/

webページにアクセスすると、`Username`と`Password`を操作するログインフォームが与えられます。webページに書かれているとおり、Usernameを`Bob`、 Passwordを`ZmlnaHQ`にしてアクセスしてみましょう。すると以下のようなページになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/a83e036f-7cfc-32e3-446b-bfc776c16278.png)

`ID`と`Username`、`rentalbook`という項目が出てきました。
#### 解法
この情報から管理者権限を取得すると、FLAGがゲットできるのではないかという検討を付けます。
そこで問題のタイトルになっているSQL Injectionについて試してみることにします。
SQLInjectionに関しては、webの第1回目の資料について確認してください。
SQL Injectionを試す方法としてはいろいろなものがありますが、一番知られているもので試してみましょう

UsernameとPasswordに`' OR '1' = '1`を指定してみましょう
裏で動いているスクリプトは今回見えませんが、この入力により、SQL文が
`SELECT * FROM users WHERE username = '' OR '1' = '1' AND password = '' OR '1' = '1'` と解釈されます。

`'1' = '1'`が常に真と返されるので、usernameの部分の検証が`TRUE`になります。
passwordの部分の検証もusernameの検証と同じく`TRUE`になります。
すると、データベース内の情報が全てSQL Injectionによって閲覧することができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/ebbaf804-73f4-9fd1-21af-1001a7d11e83.png)

flag: `kitsec{sql_In_jec_tiOn1}`
※ 今回はusernameとpasswordに同じものを指定しましたが、他にも突破する方法はあります。気になる方はぜひ他の方法も試してみて下さい。

## browsing
>このサイトの管理者は公開するべきでない管理者ページを公開してしまいました。隠されたページを探してください。
flagの形式はkitsec{}です
https://browsing.kitsecprj.uk

指定されているwebページにアクセスすると、ログインフォームが与えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/af59f829-d51e-7abe-8340-72f66038b4b8.png)

UsernameやPasswordを求められますが、これ以外情報が与えられていないため突破するのは困難です。ここで問題文に注目してみましょう。<strong>管理者は公開するべきでない管理者ページを公開してみました</strong>と書かれています。
そこで、このサイトについて公開されているページに関しての情報を得ることから始めましょう。
そこで`/robots.txt`に注目します。
### robots.txtとは？
通常、webサイトのルートに配置されているファイルで、クローラー(`ウェブページからデータを収集するために自動的にウェブを閲覧するbot`)からウェブサイトへのアクセスを許可するか、禁止するかを決定するファイル。

#### 解法
それではこのwebサイトのrobots.txtについて確認しましょう
https://browsing.kitsecprj.uk/robots.txt アクセスしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/cb2caaaa-243c-3e14-2a54-e10c61c76012.png)

すると、`User-agent: *`と`Disallow: /admin/`という2つの情報が見られることが分かります。
ここでは`User-agent: *`はすべてのウェブクローラーに対して、`Disallow: /admin/`配下の URL をクローラーにクロールしないよう指示しています。

このことから、このwebサイトには`/admin`というディレクトリがあることが明確になります。試しに https://browsing.kitsecprj.uk/admin にアクセスしてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/268b7002-fd49-bcfa-b523-d1d7d1fc8cc4.png)

このように、403 Forbiddenのレスポンス(サーバがリクエストを許可したものの、処理することを拒否したこと)が分かります。そのため`/admin`ディレクトリが存在することの確認が取れました。ここからflagが含まれていると思われるディレクトリ名を推測して入力してみましょう。

今回は https://browsing.kitsecprj.uk/admin/flag にアクセスするとflagをGETすることができます。
※ 今回flagをGETする上で使用した方法を`強制ブラウジング`といいます。詳しくは以下の資料を参考にしてみて下さい。(https://e-words.jp/w/%E5%BC%B7%E5%88%B6%E3%83%96%E3%83%A9%E3%82%A6%E3%82%BA.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/dd8bfffd-4ec1-9bec-2674-223c8c4686e9.png)

flag: `kitsec{forced_browsing_success}`

## directry_traversal
>このwebサイトには秘密のファイルが隠されています。それを探し出して下さい。
flagの形式はkitsec{}です。
https://directry.kitsecprj.uk/

指定されているページにアクセスすると、sekipro cafeという架空のカフェのメニュー表サイトにアクセスすることができます。各メニューを選択すると、商品の詳細ページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/4f9e7bb8-a3cc-c674-ee6a-a96e8bbdc645.png)

#### 解法
この問題を解くうえで、次に何をしたらいいのかを考えます。問題のタイトルが `directry_traversal` なので、ディレクトリトラバーサルがどこかで仕掛けられないか確認します。そこで商品の詳細ページにアクセスしたときのurlに注目します。

`https://directry.kitsecprj.uk/file?file_name=item1.txt`
商品が変わるごとに `/file?file_name=` の部分が変化していることが分かります。<br>
そのため、ここからディレクトリトラバーサルが仕掛けられないか試してみましょう。
試しに `file?file_name=../` を指定してみます。すると `/file?file_name= `が `/src/public` 内のファイルを参照していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/00ca8e6e-a703-6f80-f3d8-06d91fc51303.png)

webページに情報を公開するためのディレクトリとして `public` が使われていることが推測できるので、秘密の情報が含まれているディレクトリとして、`secret` が使われているのではないかと推測できます。<br>
あとは、その中にflagが含まれているのでは？という予想がつくので、最終的に `file?file_name=../secret/flag` を指定してみます。するとflagがゲットできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/b8038279-72d1-0e19-e671-75019b2013ce.png)

flag: `kitsec{di_rec_tory_tra_versa_l}`

#### 別解(上級者編)
ディレクトリトラバーサルを仕掛けるという点では、同じですが他にも解き方があります。それは直接環境ファイルを参照するという方法です。

環境ファイルを参照する際には、まずは環境変数が入っているファイルについて知る必要があります。環境変数が入っているファイルを指定するときは `/proc/self/environ` を指定します。

`/proc/`
Linux システム上で動作中のプロセスに関連する情報が格納されているディレクトリ

`/proc/self/`
Webサーバーが処理しているプロセスについて書かれているディレクトリ

`/proc/self/environ`
実行中のプロセスに関連する「環境変数」を格納しているファイル
プロセスが持つ環境情報（PATH、HTTPヘッダー、セッション情報など）が含まれる

このファイルのpathをディレクトリトラバーサルで指定することで、アクセスすることができるのかを参照することができます。このファイルはルートディレクトリから参照することができるので、適時確認した上でpathを指定します。その結果が以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619884/b502c448-1cfc-dbcc-06cc-7491b8f8bf61.png)

参考文献
https://linuc.org/study/knowledge/526/
https://qiita.com/mizutoki79/items/de7d4818a21378820eef

## 終わりに
これにて学内CTFのwriteup web編の記事を終わります。

今回の学内CTFの解きなおし、解く際に使用した脆弱性の原理や技術、脆弱性が残らないようにするにはどうすればいいのか？などを自分で調べてみるとより理解が深まって、良い学習になると思います。

ありがとうございました。