サイバーセキュリティ演習 ― Webセキュリティ基礎&実践― 12.未公開ディレクトリの不正横断対策と 認証認可制御の欠落による不正アクセス対策と エラーメッセージからの情報漏えい対策
講義内容 1. 2*. Webサイトの仕組みとWebプログラミング基礎 3.4.5*. 不正スクリプトの実行対策 6.7*. データベースの不正操作対策 8*. システムの不正操作対策とHTTPレスポンスの改竄対策 9*. 偽リクエストによるサービスの不正利用対策 10*. セッションIDの 不正取得対策 11. 総合演習(1) 12*. 未公開ディレクトリの不正横断対策と認証認可制御の欠落 による不正アクセス対策とエラーメッセージからの情報 漏えい対策 13. 総合演習(2) 14. 総合演習(3) 15. 学期末試験 ※*はレポートがある回になります。
本日の内容 ディレクトリトラバーサルの脆弱性攻撃体 験と脆弱性の修正 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 ファイル情報の漏えい 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 認可制御不備によるページの参照 エラーメッセージからの脆弱性攻撃体験と 脆弱性の修正 エラーメッセージからの情報漏えい
演習テーマ ディレクトリトラバーサル 「ファイル情報の漏えい」のリンクをクリックしま しょう。
ディレクトリトラバーサルとは 攻撃者がディレクトリ(フォルダ)をトラバーサル (横断)するパラメータを含んだURLのアクセスを実 行することで、通常はアクセスできないファイルや ディレクトリの内容を取得されてしまう脆弱性
ディレクトリの基礎知識 ルートディレクトリ ツリー構造の最上階にあるディレクトリ 一つ上の階層を指定する場合は、「../」を使う。 多過ぎた「../」は無視される。 C: docroot/../../ \apache \secret docroot/../ \docroot \php \mysql \personal
Webアプリのファイル指定方法
ディレクトリトラバーサルの攻撃手口
参考:絶対パスと相対パス 絶対パス 相対パス ルートディレクトリを基準に目的のファイルや ディレクトリを指定するパス C:\apache\docroot\public.html 相対パス 現在の階層を基準に目的のファイルやディレク トリを指定するパス public.html/../../../ = C:
演習内容(疑似的な攻撃) ディレクトリをトラバーサルするURLのアクセスを実行 し、公開されていないwin.iniファイルを表示する 脆弱性がある ウェブサイト オンライン ストア
演習の進め方 Webサイトの挙動を把握する 脆弱性となる箇所を特定する 不正アクセスのファイルパスを考える 不正アクセスのファイルパスを入力する 不正アクセスが可能なことを確認する
1.Webサイトの挙動を把握する ネットショッピングにログ インして、商品管理ページ で商品登録の挙動を確認し ましょう。 ログインID「suzuki」 パスワード「Administr@tor」 攻撃者として、利用できる ことを考える。 ソースコードを確認しま しょう。 商品登録後のURLも確認しま しょう。
2.脆弱性となる箇所を特定する 商品登録の確認ページで、ファイル名が指定された パラメータを確認できましたか? http://localhost/Web/Scenario119/VulSoft/netsho pping.php?page=15&token=448f5a761fc6d0c8cd f3e8a9bfe5e8f6cb83c4051c8a535d29d70f4fd01d9 c09&filename=av.txt filenameのパラメータに「../netshopping.php」を入力 するとどうなりましたか? http://localhost/Web/Scenario119/VulSoft/netsho pping.php?page=15&token=448f5a761fc6d0c8cd f3e8a9bfe5e8f6cb83c4051c8a535d29d70f4fd01d9 c09&filename=../netshopping.php
3.不正アクセスのファイルパスを考える 商品登録のファイルパスを確認しましょう。 ルートディレクトリのディレクトリパスを考えましょう。 C:\AppGoat01\IPATool\Scenarios\Web\Scenario11 9\VulSoft\GoodsFile\av.txt ルートディレクトリのディレクトリパスを考えましょう。 GoodsFile\VulSoft\Scenario119Web\Scenarios\IPAT ool\AppGoat01\c: ../../../../../../../(../は7個以上) win.iniファイルにアクセスするファイルパスを考えま しょう。 C:\Windows\win.ini ../../../../../../../windows/win.ini
4.不正アクセスのファイルパスを入力する 商品登録の確認ページには、次のURL文が作成されます。 http://localhost/Web/Scenario119/VulSoft/netshopp ing.php?page=15&token=448f5a761fc6d0c8cdf3e8 a9bfe5e8f6cb83c4051c8a535d29d70f4fd01d9c09&fi lename=av.txt 不正アクセスのファイルパスを含むURLを考え実行しま しょう。 http://localhost/Web/Scenario119/VulSoft/netshopp ing.php?page=15&token=448f5a761fc6d0c8cdf3e8 a9bfe5e8f6cb83c4051c8a535d29d70f4fd01d9c09&fi lename=../../../../../../../windows/win.ini
5.不正アクセスが可能なことを確認する 「Congratulations!!演習 の目標を達成しまし た。」とwin.iniの中身が 表示されたら、OKです。
ディレクトリトラバーサルの一般的な影響 ウェブサーバ内のファイルが不正に閲覧される ウェブサーバ内のファイルが不正に改ざん、削除される 本来公開していないファイルを閲覧されることで、重要情報 の漏えいにつながる ウェブサーバ内のファイルが不正に改ざん、削除される ウェブコンテンツ改ざんによるデマ、誹謗中傷の書き込みや、 スクリプトファイルや設定ファイル削除によるサーバ機能停 止などの被害を受ける可能性がある
対処方法 原因 外部から入力できるパラメータをそのまま文字列連結 してファイルパスを組み立てるため、相対パスを含む ファイル名の入力により、意図しないディレクトリの ファイルが表示されてしまい、情報が漏えいする 対処方法 ファイル名を指定する際にディレクトリ名が含まれな いように、ファイル名だけを取得するPHPの関数を用 いて実装する 入力パラメータによるファイルパスの組み立てを避ける、 あるいは記号文字の使用を避けるといった実装も対策の 方法の一つ
演習内容(脆弱性の修正) オンラインストアのディレクトリトラバーサルの脆弱性 となるコードを特定し、入力ファイル名をチェックする 実装を行う
パスのファイル名のみを返すPHP関数 basename() 引数のファイルパス/ディレクトリパスを含む文字列を 受け取って、 最後にある名前の部分を返す。 スラッシュ(/) とバックスラッシュ (\) の両方がディレ クトリ区切り文字として使われる <?php $filename = C:\Windows\win.ini $filepath = basename($filename); echo $filepath ; ?> win.ini
修正プログラム オンラインショッピング netshopping.php netshopping119.class.php メッセージ割り当て テンプレート表示 netshopping119.class.php オンラインショッピングの内容(データベースのデータ) の初期設定 攻撃成功判定 管理用メニュー商品一覧の処理 商品登録ファイル確認画面の処理
脆弱性の修正の手順 netshopping119.class.php 処理内容の確認。 ファイルパスの作成箇所の特定。 public function proc_readfile() 処理内容の確認。 ファイルパスの作成箇所の特定。 ファイル名のみを取得する。
1.処理内容の確認 public function proc_readfile() { if (!$this->check_token()) { $this->proc_logout(); return; } if ($this->is_non_admin()) { $this->set_page(parent::PAGE_GOODS); $this->proc_goods_list(); (次ページに続く) トークンチェックがNGの場合はログアウト処理 管理者権限以外ならば、商品リストのみのページを設定
1.処理内容の確認 リクエストパラメタからファイル名を取得 (つづき) $param = $this->get_param(); $filename = (string)$param[parent::FILENAME]; if ((isset($filename)) && ($filename != "")) { $filePath = parent::GOODS_FILE_PATH. $filename; if (is_file($filePath)) { $lineData = file($filePath); (次ページに続く) ファイル名がセットされている場合 商品登録ファイルへのパスを作成 商品登録ファイルが存在する場合、ファイルを読み込んで配列に格納する(配列の各要素は行データ)
1.処理内容の確認 特殊文字をHTMLエンティティに変換して、コンテンツに設定 (つづき) $this->set_content("fileData", array_map('htmlspecialchars', $lineData)); $this->set_content("fileName", $filename); $this->set_content(parent::TOKEN, hash("sha256", session_id())); $this->is_success($filename); (次ページに続く)
1.処理内容の確認 商品登録ファイルが存在しない場合 商品管理画面を表示 (つづき) } else { $this->set_content(parent::WARNING8, true); $this->set_page(parent::PAGE_ADMIN_GOODS); $this->proc_admin_goods(); } $this->set_content(parent::WARNING7, true); ファイル名がセットされていない場合 商品管理画面を表示
2.ファイルパスの作成箇所の特定 (つづき) $param = $this->get_param(); $filename = (string)$param[parent::FILENAME]; if ((isset($filename)) && ($filename != "")) { $filePath = parent::GOODS_FILE_PATH. $filename; if (is_file($filePath)) { $lineData = file($filePath); (次ページに続く)
3.ファイル名のみを取得する (つづき) $param = $this->get_param(); $filename = (string)$param[parent::FILENAME]; if ((isset($filename)) && ($filename != "")) { $filePath = parent::GOODS_FILE_PATH. basename($filename); if (is_file($filePath)) { $lineData = file($filePath); (次ページに続く)
動作確認 管理者でログインして商品管理画面のソースからトー クンを確認しましょう。 URL欄にトークンを含む次のURLを投稿しましょう ログインIDは「suzuki」、パスワードは 「Administr@tor 」 トークンはhiddenパラメータに格納されています。 <input type="hidden" name="session_id" value="t5ahoouj0ojgknjdv6ssguct44" /> URL欄にトークンを含む次のURLを投稿しましょう http://localhost/Web/Scenario119/EditSoft/net shopping.php?page=15&token= t5ahoouj0ojgknjdv6ssguct44 &filename=../../../../../../../windows/win.ini
動作確認 ログアウトになり、win.iniファイルの内容が表示され なければOKです。
ディレクトリトラバーサルの要点 ディレクトリトラバーサルの脆弱性の原因は、外部から 入力できるパラメータをそのまま文字列連結してファイ ルパスを組み立てていることです。 ディレクトリトラバーサルを防ぐためには、ファイル名 を指定する際にディレクトリ名が含まれないようにファ イル名だけを取得するようにしましょう。また、ファイ ル名を直接指定する必要が無い場合は、外部からファイ ル名を指定する実装を避けるようにしましょう。
本日の内容 ディレクトリトラバーサルの脆弱性攻撃体 験と脆弱性の修正 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 ファイル情報の漏えい 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 認可制御不備によるページの参照 エラーメッセージからの脆弱性攻撃体験と 脆弱性の修正 エラーメッセージからの情報漏えい
認証と認可 認証は対象の正当性を確認する行為 認可は対象に権限を与える行為 本人認証に使う要素 アクセス権限 正規の利用者のみが知っている情報 パスワード、PINコード 正規の利用者のみが持っているもの ICカード、本人のスマートフォンなど 正規の利用者の身体の情報 指紋・虹彩・静脈など 認可は対象に権限を与える行為 アクセス権限 スマホで使われている、PIN=Personal Identification Numberコード。 虹彩(こうさい)
認証制御の欠落の事例1 第三者でも知り得る情報を用いた認証
認証制御の欠落の事例2 認証が必要なページに対する認証処理の不備
認証制御欠落の対策 ウェブサイトで非公開とされるべき情報を取り扱う場 合や、利用者本人のみデータの変更や編集を許可する ことを想定する場合には、利用者本人のみが知る情報 を用いた認証制御の機能を実装するようにしましょう。
認可制御の欠落の事例 認可が必要なページに対する権限の確認処理の不備 情報 漏えい 情報 漏えい
認証認可制御欠落の一般的な影響 ユーザの非公開情報を閲覧される 権限のあるユーザのみが編集可能な情報を改ざん、 消去される ユーザの非公開情報を閲覧されることで、個人情報や機 密情報などが漏えいする可能性がある。 権限のあるユーザのみが編集可能な情報を改ざん、 消去される ユーザのみが編集可能な設定や個人情報が改ざん、消去 されてしまう可能性がある。
演習テーマ 認証制御や認可制御の欠落 「認可制御不備によるページの参照」のリンクをク リックしましょう。
演習内容(疑似的な攻撃) ネット証券の管理者用のページにアクセスする 脆弱性があるウェブサイト ネット証券
演習の進め方 Webサイトの挙動を把握する 脆弱性となる箇所を特定する 管理者用のページにアクセスする
1.Webサイトの挙動を把握する ネット証券に管理者アカウント でログインしユーザ管理ページ にアクセスできることを確認し ましょう。 IDは「suzuki」、パスーワード は「admin」 ユーザ管理ページのURLも確認 しましょう。 確認できたらログアウトしま しょう。
1.Webサイトの挙動を把握する ネット証券に利用者アカウント でログインしユーザ管理のリン クがないことを確認しましょう。 IDは「yamada」、パスー ワードは「P@ssword」
2.脆弱性となる箇所を特定する ネット証券の各メニューのURLはどのようになってい ますか? http://localhost/Web/Scenario124/VulSoft/bond.p hp?page=3 http://localhost/Web/Scenario124/VulSoft/bond.p hp?page=4 ページ番号がインクリメントされていて規則性がある ことがわかります。 ユーザ管理ページのURLはどのようになっています か? http://localhost/Web/Scenario124/VulSoft/bond.p hp?page=11
3.管理者用のページにアクセスする ネット証券に利用者アカウントでログインしましょう。 IDは「yamada」、パスーワードは「P@ssword」 URL欄に管理者用ページのURLを入力し、アクセスしま しょう。 http://localhost/Web/Scenario124/VulSoft/bond.p hp?page=11
3.管理者用のページにアクセスする 「Congratulations!!演習の目標を達成しました。」 と表示されたら、OKです。
対処方法 原因 管理者用ページのURLを表示しないだけとしているため、 アクセス権限のないユーザにアクセスを許してしまい、 情報漏えいを招く 対処方法 認可制御の欠落の対策としては、管理者用ページを参 照する際に利用者の権限と各ページの表示が許可され た権限と一致するかを確認する。
演習内容(脆弱性の修正) ネット証券の認可制御欠落の脆弱性となるコードを特定 し、管理者用ページを参照する際にユーザの権限を チェックする機能を実装する。
セッションID生成のPHP関数 session_id() mcrypt関数 自動的に疑似乱数を設定する。現在のセッション ID を 取得 または指定のセッションIDの設定も可能。 <?php $sessionid = session_id(); session_start(); ?> mcrypt関数 暗号理論的に安全な疑似乱数を生成することが可能。 セッション管理機構を自作しなければいけない場合は、 mcrypt関数を利用すべき。
修正プログラム ネット証券 bond.php bond124.class.php bond124.class.phpの処理内容をゲット メッセージ割り当て テンプレート表示 bond124.class.php ネット証券の内容(データベースのデータ)の初期設定 認証および入力チェック処理 管理者画面用ログインチェック処理 ユーザ名および権限の設定処理 攻撃成功判定
脆弱性の修正の手順 bond124.class.php 処理内容の確認。 権限チェック箇所の特定。 権限チェック機能の実装。 public function validate_id_logined_admin() 処理内容の確認。 権限チェック箇所の特定。 権限チェック機能の実装。
1.処理内容の確認 管理者画面でログイン状態で無ければ エラーメッセージおよび遷移ページをログイン画面に設定 public function validate_is_logined_admin() { $session = $this->get_session(); if (!(in_array((string)$this->get_page(), $this- >_non_login_pages)) && ($this->is_not_login())) { $this->set_session($this->get_login(), false); $this->set_page(parent::PAGE_LOGIN); $this->set_content(parent::WARNING2, true); return $this; } else { $this->is_success(); return true; } 管理者画面でログイン状態で無ければ エラーメッセージおよび遷移ページをログイン画面に設定 そうでなければ、管理者画面にログイン状態であることを通知
2.権限チェック箇所の特定 public function validate_is_logined_admin() { $session = $this->get_session(); if (!(in_array((string)$this->get_page(), $this->_non_login_pages)) && ($this->is_not_login())) { $this->set_session($this->get_login(), false); $this->set_page(parent::PAGE_LOGIN); $this->set_content(parent::WARNING2, true); return $this; } else { $this->is_success(); return true; }
エラーメッセージおよび遷移ページをログイン画面に設定 3.権限チェック機能の実装 public function validate_is_logined_admin() { $session = $this->get_session(); if (!(in_array((string)$this->get_page(), $this->_non_login_pages)) && ($this->is_not_login())) { $this->set_session($this->get_login(), false); $this->set_page(parent::PAGE_LOGIN); $this->set_content(parent::WARNING2, true); return $this; } elseif ($session[$this->get_login()]["auth"] !== "admin") { $this->set_content(parent::WARNING12, true); } else { $this->is_success(); return true; } ログイン状態がadminで無い場合 エラーメッセージおよび遷移ページをログイン画面に設定
動作確認 ネット証券にログイン後、URLを以下の値に変更してみ ましょう。 ログインIDは「yamada」、パスワードは 「P@ssword 」 http://localhost/Web/Scenario124/EditSoft/bond.php ?page=11 「管理者権限がありません。」と表示され、ログアウト されたらOKです。
認可制御の欠落の要点 認可制御欠落の脆弱性の原因は、認可制御の機能が管理 者用ページのURLを非表示だけとなっていることです。 認可制御の欠落を防ぐためには、管理者用ページを参照 する際に利用者の権限と各ページの表示が許可された権 限と一致するかを確認するようにしましょう。
本日の内容 ディレクトリトラバーサルの脆弱性攻撃体 験と脆弱性の修正 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 ファイル情報の漏えい 認証制御や認可制御の欠落の脆弱性攻撃体 験と脆弱性の修正 認可制御不備によるページの参照 エラーメッセージからの脆弱性攻撃体験と 脆弱性の修正 エラーメッセージからの情報漏えい
演習テーマ その他 「エラーメッセージからの情報漏えい」のリンクをク リックしましょう。
エラーメッセージ 予期しない状態が発生したときに所定の処理を続行で きない旨をユーザーに通知するメッセージ エラーメッセージの表示の原則 ユーザの注意をひきつける ユーザがエラーメッセージであることに気づく 何が問題なのか説明する 初心者でもわかるように専門用語を使わずに問題を説明す る 発生箇所を示し、対策を示唆する ユーザが問題を把握するのを助けるような情報を提供する (Wikipediaより)
エラーメッセージ出力 実行環境設定によるエラーメッセージ出力 デバッグオプションによるデバッグメッセージ出力 ウェブアプリケーションにエラーが発生した際に、実行 環境設定により自動的にプログラムに関するエラーや警 告がウェブページに出力すること PHPの設定ファイル(php.ini)でエラーメッセージ出力設 定を有効にした場合に出力される。 デバッグオプションによるデバッグメッセージ出力 開発者がバグを取り除く(デバッグ)作業のため、ウェ ブアプリケーションにデバッグオプションを指定するこ とにより、処理内容や変数の値などを出力すること デバッグ情報を出力する機能を実装し、URLパラメータに 「debug=yes」などの値を与えることで出力される。
エラーメッセージからの情報漏えいの原因 エラーメッセージ出力を有効にしたままウェブサイト を運用することで、ファイルやデータベースなど、攻 撃のきっかけとなる情報を悪意のある人に与えてしま う
演習内容(疑似的な攻撃) アンケートページでエラーを発生させて、エラー情報よ り個人情報を含んだファイルのパスを取得し、個人情報 を閲覧する。 脆弱性があるウェブサイト アンケートページ
演習の進め方 Webサイトの挙動を把握する 脆弱性となる箇所を特定する エラーを発生させる 個人情報を閲覧する
1.Webサイトの挙動を把握する アンケートページの入力 フィールドに様々な値を入力 して動作を確認しましょう。
2.脆弱性となる箇所を特定する <sの文字列をそれぞれの入力 フォームに入力して投稿して みましょう。 アンケート投稿後にエラーが 発生する箇所は?
3.エラーを発生させる 名前の入力フォームに<sの文 字列を入れてアンケートを投 稿してみましょう。
3.エラーを発生させる 「Congratulations!!演習の 目標を達成しました。」と表 示されたら、OKです。
4.個人情報を閲覧する エラーメッセージに表示される内容を確認しましょう。 Warning: write_xml(): enquete.xml:62: parser error : error parsing attribute name in C:\AppGoat01\IPATool\Scenarios\Web\Scen ario115\VulSoft\enquete115.class.php on line 214 in 上記のファイルパスを参考に、ブラウザで enquete.xmlにアクセスしましょう。 http://localhost/Web/Scenario115/VulSoft/enq uete.xml
演習テーマ その他 「エラーメッセージからの情報漏えい」の「類似問題 の演習」リンクをクリックしましょう。
演習内容(疑似的な攻撃) デバッグオプションを推測しURLのパラメータに指定す ることで、デバッグメッセージに本来公開されないはず のデータベースのテーブル名を表示させる。 脆弱性があるウェブサイト SNS
演習の進め方 Webサイトの挙動を把握する エラーメッセージを出力させる
1.Webサイトの挙動を把握する SNSにログインしましょう。 IDは「yamada」、パスー ワードは「P@ssword」
2.エラーメッセージを出力させる URLパラメータを操作して、デバッグメッセージ の出力を有効にしてみましょう。 デバッグメッセージを出力するパラメータは 以下の通りです。 debug=yes URL欄に以下のURLを入力しましょう。 http://localhost/Web/Scenario115/VulSoft /sns.php?debug=yes
2.エラーメッセージを出力させる 「Congratulations!!演習の 目標を達成しました。」と表 示されたら、OKです。
エラーメッセージからの情報漏えいにおける一般的な影響 ファイルやデータベースの情報が閲覧される エラーメッセージやデバッグメッセージが出力さ れることで、ファイルやデータベースの情報が漏 えいし、悪意のある人に、ファイルの内容を閲覧 される、SQLインジェクション攻撃を行われるなど の別の攻撃の手がかりを与えてしまう。
エラーメッセージからの情報漏えい対策 エラーメッセージからの情報漏えいの原因は、 エラーメッセージ出力を有効にしたままウェブ サイトを運用することです。 エラーメッセージからの情報漏えいを防ぐため に、ウェブサイトの運用開始時には実行環境設 定によるエラー出力やデバッグオプションによ るデバッグ出力を無効にするようにしましょう。 php.iniのdisplay_errorsをoffに設定する 本番用のソースコードではデバッグ出力機能を削 除/コメントアウトしておく
課題 実際に、 ディレクトリトラバーサルの脆弱 性を突かれて被害を受けた事件を調査し、 1)被害の内容と時期、2)攻撃方法とそ の攻撃で可能だったこと、3)脆弱性が生 まれた原因、4)実施された対策について、 参考にした情報源などを引用しつつ簡潔に まとめてください。 本講義の感想、要望、質問などあれば、書 いてください。 https://moodle.artsci.kyushu-u.ac.jp/course/view.php?id=2661