KENRO Web脆弱性基礎編コース 【Writeup編】

# はじめに
セキュリティ学習のサービスを探していたところ、一部無料になった「KENRO」を見つけました。
そこで、このサービスで脆弱性の基礎を学びたいと思います。
引用：KENRO https://flatt.tech/kenro/

# KENROとは
「KENRO」はWebエンジニアのセキュアコーディング習得を支援するSaaS型eラーニングサービスです。
「資料に目を通して三択問題のテストを受けるだけ」という一般的なeラーニングとは異なり、攻撃者が用いる手法を体験する「ハッキング演習」や、脆弱なソースコードを修正する「堅牢化演習」を通じて、より実践的なトレーニングを一元的に受講できます。
https://flatt.tech/kenro
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3a3b0a14-ece1-5ab9-513c-9982f4df373e.png)

# Web脆弱性基礎編コース（トライアル版）
Web アプリケーションにまつわる基礎的な脆弱性を一通り学ぶことができるコースです。

# ハッキング演習
# Q1)基礎的な OS Command Injection 攻撃

    演習環境には OS Command Injection 脆弱性が含まれています。
    その脆弱性を利用し ls . コマンドを実行すると、flatt{...} 形式の文字列が見つかるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/ef2caaa2-904a-6ca6-92c6-feee10eafc10.png)
A1)
ping コマンドを実行できるアプリっぽい。他のコマンドも実行できる可能性がある。

入力欄に`example.com`を指定すると、`ping example.com`の結果が返ってきた。
`&&`を使えば、他のコマンドとか使えそうだと予測。
入力欄に`example.com && ls .`と入力。
フラッグを発見。
`flatt{you_found_a_secret_url_with_os_command_injection}`

# Q2)XML External Entity 脆弱性を経由したファイルの読み出し

    演習環境には XML External Entity 脆弱性が含まれています。
    その脆弱性を利用し、サーバ中のファイル /flag.txt を読み出し、
    その中に書かれた flatt{...} 形式の文字列を解答してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b6d6c97e-2a3c-f00c-e178-acb89c762f93.png)
A2)
`XML ドキュメントの中の <name> タグの中身を表示します。`と記載されているので、
正常系のファイルをアップロードしてみます。
`ソースコード-正常系`

    <?xml version="1.0" encoding="utf-8" ?>
    <top>
    <name>TEST</name>
    </top>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/dc2f6e4a-dbdc-e108-a1bd-880e95d52f3c.png)
`<name>`タグの中身が表示されました。では、次にアップロードするファイルを以下の様に改変します。

`ソースコード-異常系`

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE top [
     <!ENTITY trap SYSTEM "file:///flag.txt">
    ]>
    <top><name>&trap;</name></top>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0c4bbfd4-c750-f665-2b71-77b0967e8b65.png)
`trap`が呼び出されました。（これは`SYSTEM "file:///flag.txt`を呼び出す）
フラッグ発見。
`flatt{arbitrary_file_read_by_xxe}`

# Q3)iframe の透明化

    演習環境に書かれた指示に従って、透明化された iframe タグを探し、
    flatt{演習環境中で透明化されている iframe タグの class 属性の値} を解答してください。
    詳しい指示は演習環境を確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/43783212-0d03-261a-4115-4e70ff659ad4.png)
A3)
F12キーにより開発者ページを開きます。
`<style>`タグで囲まれている中身を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a7d4c8d8-f318-3fd1-c918-b9657fe4f856.png)

`opacity`プロパティを用いることで**要素の透明度**を指定できるので、次の箇所が怪しそうです。

     .sample-dgsgr4og {
        opacity: 0%;
      }

これに該当する`<iframe>`タグの箇所を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/5f976bfc-b34b-f569-5ba5-3ac7c03175e5.png)
フラッグ発見
`flatt{sample-dgsgr4og}`

# Q4)Insecure Deserialization 脆弱性によるロジックの破壊

    演習環境は入力として文字列を与えると、Hello, （与えた文字列） を画面に表示してくれる Web アプリケーションです。
    また、途中の入力値の検査により、admin という値は入力値として与えられないようになっています。
    しかし、このアプリケーションには Insecure Deserialization 脆弱性があります。
    そのため、直接 Cookie 中のキー instance の値を直接変更することで、本来禁止されている入力値も与えられるようになっています。
    例えば、Cookie を直接以下の値に改ざんすることで、入力値 admin を検査を回避しつつアプリケーションに与えることができます。

    O%3A6%3A%22Sample%22%3A1%3A%7Bs%3A12%3A%22%00Sample%00name%22%3Bs%3A5%3A%22admin%22%3B%7D

    実際に上記の値に Cookie 中のキー instance の値を改ざんしてみてください。
    うまくいくと画面に flatt{...} 形式の文字列が表示されますから、それを解答してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/ab244651-f650-7fba-3c54-32499673070d.png)

A4)
`admin`を指定すると、エラーになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/fbcc63c3-719d-0276-1f30-4c85b4a06fa7.png)
そこで、Cookie のキー instance の値を書き換える。
フラッグを発見。
`flatt{insecure_deserialization_induces_unexpected_vulnerabilities}`

問題は解けたが、あんまり理解できてない。。。
シリアライズ・デシリアライズに関して、別途勉強する必要がありそうだ

# Q5)基礎的なディレクトリトラバーサル攻撃

    演習環境のサーバには /secret/flag1 という名前の、flatt{...} 形式のデータが書かれたファイルが存在します。
    このファイルを、演習環境中に存在するディレクトリトラバーサル脆弱性を利用することで読み出し、ファイルの中身を解答してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c6cc08d3-9f38-f39a-b3c2-7fdd991ca69d.png)

A5)
`閲覧したいファイル`には`a.txt``b.txt``c.txt`が格納されています。
その時のURLは`https://basic-dirtrav-attack.flatt.training/?filename=a.txt`です。
演習環境サーバには、`/secret/flag1`というファイルがあるらしいので上記のURLに対してDirectory Traversal 攻撃を実施します。

アクセスするURL
`https://basic-dirtrav-attack.flatt.training/?filename=../../../../../secret/flag1`

フラッグを発見。
`flatt{directory_traversal_is_so_dangerous}`

# Q6)ディレクトリトラバーサルによるサーバ設定ファイルのリーク

    演習環境のサーバは nginx を利用しており、その設定ファイルは /etc/nginx/conf.d/default.conf に格納されています。
    このファイルを演習環境中に存在するディレクトリトラバーサル脆弱性を利用することで読み出すと、
    開発者しか知らないはずの URL 定義が見つかるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c6cc08d3-9f38-f39a-b3c2-7fdd991ca69d.png)

A6)
Directory Traversal 攻撃によりディレクトリの情報を読み出せないか確認します。
アクセスするURL
`https://basic-dirtrav-attack.flatt.training/?filename=../../../../../../etc/nginx/conf.d/default.conf`

ファイルの中身の読み出しに成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/369766e8-4c31-f66a-d782-3aaa46fa9f6c.png)

コメントアウトされた箇所に次の文がありました。

    # /secret_path_only_developer_can_know にアクセスすると答え（flatt{...} 形式のデータ）が得られます。
    location = /secret_path_only_developer_can_know {
     default_type text/html;
     alias /secret/flag2_2a46993a50cbe5a6b14f76e5ac4d8514;
    }

指示されたURLへアクセス。
`https://basic-dirtrav-attack.flatt.training/secret_path_only_developer_can_know`

フラッグを発見。
`flatt{server_configurations_include_a_lot_of_useful_information}`

# Q7)Reflected XSS 脆弱性

    この演習環境には Reflected XSS 脆弱性が存在しています。
    そのReflected XSS脆弱性を利用して、このWebページ中に<script>alert(1)</script>を挿入してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4f6ee918-8cd1-10e2-4d8d-7d2ea890afa8.png)

A7)
`<script>alert(1)</script>`を挿入する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/45fd44c6-c65f-bb49-f983-80204c94d21a.png)
フラッグを発見。
`flatt{this_is_reflected_xss}`

# Q8)DOM-based XSS 脆弱性

    この演習環境には DOM-based XSS 脆弱性が存在しています。
    そのDOM-based XSS脆弱性を利用して、このWebページ中に<img src=x onerror=alert(1)>を挿入してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3be32b8e-d14a-8c62-79f6-f2d2532924a4.png)
A8)
`<img src=x onerror=alert(1)>`を挿入する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/f4d13e79-909e-0e86-2ec6-683a8fd5859b.png)
フラッグを発見。
`flatt{dom_based_xss_is_different_from_other_types}`

# Q9) SQL Playground

    演習環境には以下のようなテーブルが定義されています。このテーブルには flatt{...} という形式のデータが保存されています。
    このデータを SELECT 文で取得し、flatt{...}という形式の文字列を解答してください。

    CREATE TABLE `members` (`username` TEXT NOT NULL,`profile` TEXT NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/52421f4b-ca98-4880-7387-605067a770a2.png)

A9)
分かっているのはテーブル名（`profile`）、カラム名（`sername`、`profile`）。
この情報からDBに保存されているレコードを取得できるか実行。

    select * from members;

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4471a2ce-f41d-05e4-6650-c9bcdc548b17.png)

フラッグを発見。
`flatt{just_a_select_query}`

# Q10)ログイン機能に存在する SQL Injection

    演習環境はログイン機能を持った Web アプリケーションです。
    SQL Injection 攻撃によりユーザー名 admin としてログインしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/10e76add-b95a-60ea-24f0-7bf8fb92cf76.png)

A10)
問題文から、ユーザー名は`admin`である。パスワードは分からないのでSQLiができるか試してみる。
`'`をパスワード欄に入れるとエラーが出てきた。ここから、SQLiの可能性が浮上。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a720d100-78e6-c9d1-23a3-fd0f97874c4b.png)

実行結果

    pass ' OR '1' = '1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/10267352-5a15-7579-366f-7947c546252c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/9848f33e-b73f-16f8-0a46-200f8af17396.png)
フラッグを発見
`flatt{login_bypass_by_sql_injection}`

***
*Good luck*