やられサイトで脆弱性診断してみた


## はじめに
先日、GSX社の[認定Webアプリケーション脆弱性診断士](https://www.gsx.co.jp/services/securitylearning/securist/webappnwsecuritytesting.html)を取得したので徳丸先生のやられサイトでアウトプットしてみることにした。

## そもそも認定Webアプリケーション脆弱性診断士ってなに？
> 認定Webアプリケーション脆弱性診断士(Web application Security Testing)は、Webアプリケーション脆弱性診断に取り組むために必要な攻撃技術の知識、診断技術や脆弱性判定の基準などを習得、認定することを目的にしています。
引用元：https://www.gsx.co.jp/services/securitylearning/securist/webappnwsecuritytesting.html

つまり、[脆弱性診断士スキルマッププロジェクト](https://owasp.org/www-chapter-japan/)が策定した脆弱性診断士（Webアプリケーション）スキルマップ＆シラバスの「Silver」 ランクをもとに認定される脆弱性診断士のこと

## では、本題
今回は様々な脆弱性が意図的に組みこまれたやられサイトで脆弱性診断してみる

### 使うやられサイト、資料
1. サイト
    - [Bad Todo](https://github.com/ockeghem/badtodo)
2. 資料
    - [ウェブ健康診断仕様](https://www.ipa.go.jp/security/vuln/websecurity/ug65p900000196e2-att/000017319.pdf)
   [Webアプリケーション脆弱性診断ガイドライン](https://github.com/OWASP/www-chapter-japan/tree/master/skillmap_project#web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%84%86%E5%BC%B1%E6%80%A7%E8%A8%BA%E6%96%AD%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3)といったもっと細かい診断ガイドラインもあるが、今回はIPA公開の資料でやってみる

## スタート！
### まずは準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/d05075b2-6ec0-5f24-15cd-270d0314891f.png)
サイトに入るとまずはこの画面になるので、ログインをする。管理者のTODOリストが表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/b0cb9a80-58f7-ba30-155a-5bbec8a321c7.png)
ログインが正常にできることが確認できたので、ログアウトする

では、始めていこう！
- SQLインジェクション
- XSS(クロスサイトスクリプティング)

で今回は見ていく

### SQLインジェクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/66f53a63-2e57-5481-26b3-8142458f6109.png)
#### 1. 検索項目に「'(シングルクォーテーション)を1個いれる」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/ed2782ce-7362-5b43-de30-ca0fe0187469.png)

その結果、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/2431bf16-b8ef-7fa0-f8b3-be6c7c2375ce.png)
脆弱性の有無の判断基準、その詳細は
> 脆弱性有無の判断基準：エラーになる
 詳細：レスポンスに DBMS 等が出力するエラーメッセージ（例：SQLException、Query failed 等）が表示された場合にエラーが発生したと判定します

とあるので、結果を確認するとDBMSにかかわるエラーメッセージが表示されてるのが確認できるので、SQLインジェクションの脆弱性があることがわかる

パターン2もやってみる
#### 2. 「検索キー」と「検索キー'and'a'='a」 の比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/612c7fd4-6768-c9d9-3827-64eebe8d40b1.png)
この状態でログインすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/4abf3577-85fe-825c-ce01-a14b501a8cb1.png)
ログインができることが確認できた
脆弱性の有無の判断基準、その詳細は、
> 脆弱性有無の判断基準：検索キーのみと同じ結果になる
詳細：HTTPステータスコードが一致し、かつレスポンスのdiff（差分）が全体の 6% 未満の場合、同一の結果と判定します。検査対象が検索機能の場合は、検索結果件数が同一の場合にも、同一の結果と判定します。

とあるので、ログイン結果からここでもSQLインジェクションの脆弱性があることがわかった

## XSS(クロスサイトスクリプティング)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/a57b8016-0a59-89dc-e872-78ce098a7c9c.png)
### 1.「'>"><ｈｒ>」をいれる(フォームでは半角文字で入れます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/289354ce-eeff-6431-b15a-ec8f58702f79.png)
その結果、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/776383f3-fe47-810a-7ba1-70b92e7c93ec.png)
脆弱性の有無の判断基準、その詳細は、
> 脆弱性有無の判断基準：エスケープ等されずに出力される
詳細：レスポンスボディーに検査文字列の文字列がエスケープ等されずに出力されると脆弱性ありと判定します。

実際、画面上でもhtmlタグがエスケープされていないので、XSSの脆弱性があることがわかる

どんどんやっていこう
### 2. `「'>"><script>alert(document.cookie)</script>」`を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/dd56c453-7f2b-5395-d30b-6f58738f948e.png)
その結果、ポップアップが表示された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/1f6b6147-5ef3-9e1c-d28b-b0ebbe1e1851.png)

レスポンスを確認してみよう(一部文字化けしてるのはご了承ください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739895/90423635-8bff-ecfd-26d9-83aa99de1eae.png)

脆弱性の有無の判断基準は、
> 脆弱性有無の判断基準：エスケープ等されずに出力される

なので、こちらもscriptタグがエスケープされることなく、レスポンスが返され、その結果scriptタグの内容がそのまま解釈されてしまったので、XSSの脆弱性があると判断できる

## 終わり
WEBでの脆弱性としてよくあげられる2つの脆弱性を見てみたが、実際に被害を受けると影響度はかなり深刻になる場合が多い。ほかにもいろんな脆弱性が隠されているとのことなので、今後も探していきたい