OWASP Juice Shop でWebアプリの脆弱性を体験してみる

2021.08.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

OWASP Juice Shopを触りつつOWASP Top 10の理解を深めるという目的で社内勉強会を開きました。 その時の資料を公開します。EC2に構築してみんなで同じサイトをワイワイガヤガヤ攻撃してみました。

OWASP Juice Shop というのは OWASPが提供するやられアプリ、やられサイトの一種です。Node.js、Express、AngularJSで開発されているSPAアプリです。Dockerイメージで提供されています。

OWASP Juice Shop

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を試してみましょう

  1. Bonus Payload
  2. 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の方なので古そうです。

https://aws.amazon.com/jp/about-aws/whats-new/2017/07/use-aws-waf-to-mitigate-owasps-top-10-web-application-vulnerabilities/

最後に

1時間の勉強会でやったのは以上になります。今回は簡単な問題しかできませんでしたが今度はもっと難しい問題に挑戦したいと思います! あと、Webアプリの脆弱性診断ツールのOWASP ZAPでOWASP Juice Shopを攻撃してみたらどうなるか気になるので試してみたいですね。