公開:2022.11.28 10:00 | 更新: 2022.11.28 12:07
Webアプリケーションを開発及び運用する上でWebアプリケーションへの脆弱性への理解は必要と考えます。
また脆弱性の診断を行う際にも攻撃手法を知らなければ脆弱性の発見もできません。
そういったWebアプリケーションのセキュリティ学習のため脆弱性アプリケーション(いわゆるやられアプリ)というものが存在します。
過去にも脆弱性アプリ(やられアプリ)の紹介をしてきました。
・DVWA
Dockerで脆弱性のあるサイト環境構築
・Web Goat
手軽にハッキングのテストがしたいって?ならDocker立てなよ!
今回は、OWASPが公開している「OWASP Juice Shop」を紹介したいと思います。
こちらもDockerを使用することで容易に環境構築が可能となっております。
Dockerについては以下の過去ブログで詳しくまとめられていますので、そちらの記事を参照ください。
関連ブログ:Dockerで脆弱性のあるサイト環境構築
「OWASP Juice Shop」は、セキュリティトレーニング、CTFの学習として使用することができるやられアプリです。
また「OWASP Top 10」と呼ばれるWebアプリケーションセキュリティの重大な10のリスクを含んでいますので、セキュリティ学習として効率の良いものとなっています。
Dockerへの展開については以下のURLを参照し構築していきます。
コマンドプロンプトを開き下記コマンドを実行します。
docker pull bkimminich/juice-shop
「OWASP Juice Shop」のイメージがダウンロードされます。
次に、ダウンロードしたイメージをコンテナに展開し起動します。
docker run --rm -p 3000:3000 bkimminich/juice-shop
起動したら、下記URLをコピーしブラウザにペーストするとサイトへアクセスできます。
http://localhost:3000
※上記の構築手順ではポート番号「3000」としております。
環境に併せてポート番号を変更ください。
これで「OWASP Juice Shop」の構築は完了しました。
これより3問ほどネタバレになりますが解いてみたいと思います。
Welcomeダイアログにあります「Help getting started」ボタンを押し、チュートリアル(以下、和訳)を確認します。
ナビゲーションやサイドバーにはリンクがありません。
でも「スコアボード」を探すこと自体が、実はハッキングの課題のひとつなんです。
手がかりを得るために、[ソース] タブでクライアント側の JavaScript を調べます。
または、URL 推測を開始します。それはあなた次第です!
手がかりを得るためWebブラウザのDevTool(ショートカットキーF12)を開き、[Sources]タブにありますjsファイル上からキーワード「scoreboard」で検索してみます。
検索したところmain.jsで25件が該当することがわかりました。
該当内の「~Visible」に値を入れている個所があやしいと思いコード整形(左下にある「{ }」ボタン押下)の上、Breakpointを配置しデバッグしました。
デバッグの結果、this.scoreBoardVisibleに「false」を入れているので、試しにe[0].solvedを「true」に変更してみます。
画面表示後、サイドバーに「スコアボート」のリンクが表示されていることに気づきました。
「スコアボート」のリンク押し、スコアボート画面を表示するとクリアとなります。
今回はJavascriptをデバッグ操作しましたが、実はもっと簡単な方法がありますので、ぜひ解いてみてください。
IPAの「ソフトウェア等の脆弱性関連情報に関する届出状況」によりますと、Webサイトの脆弱性の大半は「XSS(62件)」が最も多く、次いで「SQL インジェクション(16件)」となっています。
攻撃手法としてはどちらも突きやすく、またアプリケーション開発でも見落としやすい脆弱性となります。
ソフトウェア等の脆弱性関連情報に関する届出状況[2022年第1四半期(1月~3月)]:IPA 独立行政法人 情報処理推進機構
「XSS」「SQLインジェクション」を「OWASP Juice Shop」で学習してみたいと思います。
「XSS」はスコアボートになります「Bonus Payload」で学習できます。
説明の通り以下のiframeタグを埋め込む必要がありますので、試しに右上にある虫眼鏡アイコンの検索ボックスに文字列を指定し「Enter」キー押下します。
https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/771984076&color=%23ff5500&auto_play=true&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true
結果、検索結果に入力したiframeタグがサニタイズされないまま表示されクリアとなります。
どうしてサニタイズされていないのかDevToolにて確認してみますと、sanitizer.bypassSecurityTrustHtmlメソッドで信頼された文字列の扱いとなっていました。
「SQLインジェクション」はスコアボートになります「Database Schema」で学習できます。
説明より「DBスキーマ全体の定義を抽出」することが目的のため、DBに問い合わせする必要があります。
DBに問い合わせに関連しそうな検索ボックスで検索します。
また本題では検索処理のリクエストとレスポンスをキャプチャする必要がありますので、ローカルプロキシツールと呼ばれるツールを使用します。
今回は「Burp Suite」を使用します。
検索ボックスに「banana」を入力して検索した結果、以下のリクエストがキャプチャできました。
「http://localhost:3000/#/search?q=banana」とGETリクエストになっていますが、キャプチャでは「?q=」とパラメータが未指定になっています。
「Repeater」機能でリクエストを「?q=banana」に編集しSendしてみたところ、bananaのJsonデータが取得できます。
試しに「?q=banana' or ‘1'=’1'」とSQLインジェクションを仕掛けてみますと、以下のエラーが発生しました。
エラーのメッセージに大ヒントとなる以下の情報が付随していますね。
sqliteでDBスキーマを検索する「select sql from sqlite_master」を、以下のようパラメータに結合させます。
SELECT * FROM Products WHERE ((name LIKE '%banana'or'1'='1'%' OR description LIKE '%banana')) union select sql,2,2,2,2,2,2,2,2 from sqlite_master --%') AND deletedAt IS NULL) ORDER BY name
Productsテーブルの列が9つなため、sqlite_masterにない列を適当な値「2」を指定しています。
不要なクエリを--でコメントアウトさせています。
「Repeater」機能でリクエストを編集しSendしてみた結果、スキーマ情報が取得できクリアとなります。
脆弱性アプリケーション(やられアプリ)にふれることでセキュリティの学習が行えることがわかりました。
Webアプリケーションの脆弱性について理解し、アプリケーションの開発及び運用、脆弱性の診断で活かしてみてはいかがでしょうか。
またWebアプリケーションへの攻撃手法は他にも存在します。過去の記事にて説明がありますので参考にしてください。
関連ブログ
Webアプリケーションへの攻撃手法について
LOADING...