やられサイト「BadTodo」で脆弱性を探してみよう【脆弱性のネタバレ注意】

「SQLインジェクション」や「クロスサイト・スクリプティング」等の脆弱性を宝探し形式で学習できます!
2023.03.28

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

今回のテーマ

こんにちはAWS事業本部コンサルティング部のこーへいです。

今回のテーマは「BadTodoで脆弱性に詳しくなろう」です。

準備

まずBadTodoとは?

「やられサイト」と呼ばれる意図的に様々な脆弱性を含ませた学習用アプリケーションとなります。

先月末に徳丸本にてお馴染みの徳丸先生が作成、無償公開されたアプリで、重要な脆弱性をアプリ内にて網羅しているので実際に手を動かし脆弱性を学ぶことができます。

多数の脆弱性をアプリ内に忍ばせられており、まるで宝探し感覚で脆弱性に対する勘所を養えるでしょう。

GitHubにてアプリコードが公開されておりますので、今回はこちらを利用し実際に試していきましょう。

環境準備

全てのツールのインストール手順を記載すると記事が長くなるし、すごく疲れるので徳丸先生が動画やドキュメントにて環境準備を分かりやすく解説してくださっているのでそちらを紹介します。

以下はインストール対象一覧です。

  • Docker Desktop(BadTodoがコンテナアプリなので)
  • Git(GitHubからダウンロードするために)
  • BadTodoコンテナ(本記事にて解説するアプリ本体)
  • BurpSuite Community(脆弱性診断の補助ツール)

「Docker Desktop」や「Git」は多くの方がインストール済みだと思いますので、「BadTodo」アプリの準備(起動)とBurpSuite Communityのインストールが環境準備のメインになるかと思います。

ウェブ健康診断仕様とは

ウェブ健康診断 仕様

その名の通り、ウェブサイトの脆弱性を診断する為に参考する資料となります。 重要度の高い13の脆弱性に対し、各脆弱性の内容や危険度、判定基準や確認方法が掲載されています。

今回はこちらの資料を元に、やられサイト「BadTodo」の脆弱性を確認してみましょう。

早速試してみよう

ブラウザ(Chromium)を開く(※注意:ここからネタバレ注意)

画像の通りBurpSuiteを開き、Proxy > Intercept > Open browerでブラウザ(Chromium)を開けます。

Chromiumにて、https://todo.example.jp/にアクセスすると、「BadTodo」のトップページを開けます。

SQLインジェクション

引用元:ウェブ健康診断 仕様

まずは通常のログインを行い、その後SQLインジェクションの1、2番を試してみましょう。

通常のログインを行う

  1. 「BadTodo」トップページに記載されている管理者用のユーザーID(admin)とパスワード(passwd)を控える
  2. ログイン画面にて入力しログインする
  3. ログイン完了、画面右上にユーザーIDが正しく表示される

特に問題なくログインできました、一旦ログアウトし次は脆弱性を確かめてみましょう。

SQLインジェクション1番を試す

  1. ユーザーIDにて「'」 (シングルクォート 1 つ) を入力する(パスワードはそのままpasswd)
  2. エラーを確認する

ウェブ健康診断仕様では、脆弱性有無の判定基準が「エラーになる」であり、さらに備考には「レスポンスにDBMS等が出力するエラーメッセージが表示された場合にエラーが発生したと判定します」と記載されています。

実際のエラー画面もDBMS等が出力するエラーメッセージに該当すると考えられるので、SQLインジェクションの脆弱性があると判断して良いでしょう。

SQLインジェクション1番は徳丸先生が動画にて解説してくださっています。

SQLインジェクション2番を試す

同じくログアウトし、再度ログイン画面に戻ります。

  1. ユーザーIDを「admin'and'a'='a」、パスワード(passwd)とする

  2. ログインし画面右上のユーザーIDを確認する

さて次は何故かログインに成功し、ユーザーIDも「admin'and'a'='a」と表記されています。

ウェブ健康診断仕様では、脆弱性有無の判定基準が「検索キーのみと同じ結果になる」となっているため、ログイン成功=脆弱性があると考えて良いでしょう。

クロスサイト・スクリプティング

引用元:ウェブ健康診断 仕様

クロスサイト・スクリプティング1番を試す

SQLインジェクションの時と同様にログイン画面にて脆弱性を確認してみましょう。

  1. ユーザーIDを「'>"><hr>」、パスワードを「passwd」とする

ウェブ健康診断仕様では、脆弱性有無の判定基準が「エスケープ等されずに出力される」です。

実際にエラー画面にて、エスケープされず出力されているため脆弱性があるという結果になりました。

クロスサイト・スクリプティング2番を試す

  1. ユーザーIDを「'>"><script>alert(document.cookie)</script>」、パスワード「passwd」とする

今度は入力したスクリプトが実行され、先にポップアップが表示されました。

BurpSuiteのレスポンス結果を確認しても「'>"><script>alert(document.cookie)</script>」がエスケープされておらずスクリプト実行されポップアップが表示されたことから、脆弱性があることが確認できます。

まとめ

今回は徳丸先生の「BadTodo」の脆弱性を探してみようというテーマで執筆しました。

自分自身、脆弱性に関しては知識ベースの知見しかなく実際に手で触ることでより理解を深めるきっかけになりました。

今回紹介した脆弱性はあくまでほんの一部で、アプリ内にはまだまだ脆弱性は残っています。

皆さんもぜひ探してみてください。