OWASP Juice Shop でWebアプリの脆弱性を体験してみる
はじめに
OWASP Juice Shopを触りつつOWASP Top 10の理解を深めるという目的で社内勉強会を開きました。 その時の資料を公開します。EC2に構築してみんなで同じサイトをワイワイガヤガヤ攻撃してみました。
OWASP Juice Shop というのは OWASPが提供するやられアプリ、やられサイトの一種です。Node.js、Express、AngularJSで開発されているSPAアプリです。Dockerイメージで提供されています。
OWASP BWA (The Broken Web Applications) という同じようなアプリがもう1つあるのですが、OWASP Juice Shopの方が新しいようです。BWAはVirtual Boxが必要です。
OWASP Juice Shopを構築する
dockerをインストール後、pullしてrunするだけです。
sudo yum install -y docker sudo service docker start sudo docker pull bkimminich/juice-shop sudo docker run -d -p 80:3000 bkimminich/juice-shop
EC2で構築する場合は必要に応じてセキュリティグループの設定を行ってください。
OWASP Juice Shopに攻撃を仕掛ける前に
OWASP Juice Shopに攻撃を仕掛けるにあたり、攻撃の方法が分からなかったので調べました。攻撃の仕方がまとまったIPAの資料があったのでこちらを参考してみます。
https://www.ipa.go.jp/security/vuln/websecurity.html
攻撃の仕方に関しては以下の資料が参考になりました。 「ウェブ健康診断仕様」8ページくらいから。
https://www.ipa.go.jp/files/000017319.pdf
同じくIPAの資料ですが以下に脆弱性への対応方法がまとまっています。 『安全なWebアプリケーションの作り方(第2版)』6ページ
https://www.ipa.go.jp/files/000017316.pdf
OWASP Juice Shopに接続する
構築済みのOWASP Juice Shopに接続します。以下のURLに接続します。
http://IPアドレス/
ヘルプを確認する
初めての場合は以下の様にダイアログが表示されます。左下のHelp getting startedというボタンを押すと、画面左上にヘルプが出ます。ガイドには最初にスコアボードのURLを探してね、とあるのでスコアボードのパスを見つけるところから始めましょう。
ヘルプは時間が経つと勝手に進んでしまうのでメッセージを残しておきます。
This application is riddled with security vulnerabilities. Your progress exploiting these is tracked on a _Score Board_. You won't find a link to it in the navigation or side bar, though. Finding the _Score Board_ is in itself actually one of the hacking challenges. You could just start guessing the URL of the _Score Board_ or comb through the client-side JavaScript code for useful information. You find the JavaScript code in the DevTools of your browser that will open with `F12`. Look through the client-side JavaScript in the _Sources_ tab for clues. Or just start URL guessing. It's up to you!
問題1 スコアボードを探す
ヒント
- F12でDeveloper Toolを表示しながら試してください。
- SourcesタブのJavascriptがminifyされているので、Pretty Printで見やすくしてください。
- Javascriptのソースコード内をキーワードで探してみてください。
スコアボード
スコアボードのURLを見つけることができたでしょうか?どうしてもできなかった場合はネットで調べれば分かりますので、調べてみてください。
スコアボードは一度開くと左のメニューから遷移できるようになります。 スコアボードでは問題の一覧を見ることができます。カテゴリーでフィルタリングできるのですが、OWASP Top 10の項目がカテゴリーになっているものがあり、どういった脆弱性なのか試してみることができます。
OWASP Top 10の項目の説明は以下にあります。2017年版が最新版のようです。
https://owasp.org/www-project-top-ten/
カテゴリーには以下の7つの問題がありました。
- A1:2017:インジェクション : Injection
- A2:2017:認証の不備 : Broken Authentication
- A3:2017:機微な情報の露出 : Sensitive Data Exposure
- A5:2017:アクセス制御の不備 : Broken Access Control:
- A6:2017:不適切なセキュリティ設定 : Security Misconfiguration
- A7:2017:クロスサイト・スクリプティング(XSS) : Cross-Site Scripting XSS
- A9:2017:既知の脆弱性のあるコンポーネントの使用 : Using Components with Known Vulnerabilities
OWASP Juice Shopに攻撃してみる
A1:2017:インジェクション : Injection
今回は一番メジャーなSQLインジェクションを試してみます。
SQLインジェクションとは
『安全なWebアプリケーションの作り方(第2版)』6ページをご覧ください。
https://www.ipa.go.jp/files/000017316.pdf
対策は『安全なWebアプリケーションの作り方(第2版)』の7ページにあるように
- エスケープする。
- プリペアドステートメントを使う。
- エラーログを表示しない。
あたりですね。
問題2 ログイン画面でSQLインジェクションしてみましょう。
実はログイン画面に致命的な脆弱性があります。F12でデベロッパーツールを開いてみましょう。 テキストボックスにIPAの資料の9ページにあるSQLインジェクションの検出パターン1 に書かれている「'」 (シングルクォート 1 つ) を入力することで発見できます。login の Responseに面白いものが出ているので確認してみてください。
これにより、Score Board にある「Error Handling」という課題がクリアになります。エラーの内容をHTTPのレスポンスに返すのがよくないということかと思います。
問題3 SQLインジェクションの難問
星2(難易度レベル2)の問題ですがもう一問、管理者でログインする、といった問題がありました。Login Adminという問題です。Score Board を星2、カテゴリーを「Injection」でフィルタリングすると出てきます。面白いのでぜひやってみてください。こちらもSQLインジェクションを使います。こちらの問題はチュートリアルがついています。赤枠の帽子のようなアイコンをクリックしてみてください。
ヒント
- SQLは -- でそれ以降をコメント化できます。
A7:2017:クロスサイト・スクリプティング(XSS)
XSSとは
概要は『安全なWebアプリケーションの作り方(第2版)』22ページ 対策は『安全なWebアプリケーションの作り方(第2版)』23ページ をご覧ください。
https://www.ipa.go.jp/files/000017316.pdf
対策は『安全なWebアプリケーションの作り方(第2版)』の23~29ページにあります。
問題4 XSSを試してみましょう
- Bonus Payload
- DOM XSS
星1で簡単なのが2つあります。Score Board を星1、カテゴリーを「XSS」でフィルタリングすると出てきます。ほとんどDescriptionに答えが書いてあるようなものですが、アプリ内のテキストボックスに入れて試してみてください。こちらもチュートリアル付になります。
A3:2017:機微な情報の露出 : Sensitive Data Exposure
「機微な情報の露出」とはどのような脆弱性なのでしょうか?SQLインジェクションやXSSの様に攻撃方法の名前ではないのでちょっとイメージしづらいです。問題がありますので見てましょう。
問題5 Confidential Documentという項目を試してみましょう。
Score Board を星1、カテゴリーを「Sensitive Data Exposure」でフィルタリングすると、「Confidential Document」という問題がありますのでこちらに挑戦してみたいと思います。Descriptionを見ただけだと、とっかかりがないのでどこを調べたらよいか分からず困りますよね。右の赤枠の中にある <>
アイコンはこの課題に関連するコードスニペットになりますので、まずはこちらをご覧ください。
この課題は時間が余ったらやろうと思っていて、答えを知らない状態で挑戦したのですがなんとかクリアできました。
ヒント
- Score Boardからコードスニペットが見れます。ここだけ見れば勘で分かる人もいると思います。
- 左のメニューに「About us」という画面があります。ここの画面のリンクがヒントになります。勉強会の時には同僚はこのページから見つけていました。
その他
OWASP TOP 10の脆弱性に対しAWS WAFでガードする
以下のホワイトペーパーからAWS WAFのCloudFormationテンプレートをダウンロードできるので簡単にWAFの設定をすることができます。 ただ、AWS WAFのClassicの方なので古そうです。
最後に
1時間の勉強会でやったのは以上になります。今回は簡単な問題しかできませんでしたが今度はもっと難しい問題に挑戦したいと思います! あと、Webアプリの脆弱性診断ツールのOWASP ZAPでOWASP Juice Shopを攻撃してみたらどうなるか気になるので試してみたいですね。