サイバーセキュリティ演習 ― Web セキュリティ基礎 & 実践 ― 3. 不正スクリプトの実行対策
講義内容 1. 2 *.Webサイトの仕組みとWebプログラミング基礎 *.不正スクリプトの実行対策 6.7 *.データベースの不正操作対策 8 *.システムの不正操作対策とHTTPレスポンスの改竄対策 9 *.偽リクエストによるサービスの不正利用対策 10 *.セッションIDの 不正取得対策 11.総合演習(1) 12 *. 公開ディレクトリの不正横断対策と認証認可制御の欠落 による不正アクセス対策とエラーメッセージからの情報 漏えい対策 13.総合演習(2) 14.総合演習(3) 15.学期末試験 ※* はレポートがある回になります 。
本日の内容 Webサイトの脆弱性について クロスサイトスクリプティングの脆弱性攻 撃体験と脆弱性の修正 アンケートページの改竄(反射型)
脆弱性とは 脆弱性は 、 コンピュータソフトウェアの欠陥 ( バ グ 、 不具合 、 あるいはシステム上の盲点 ) のひと つで 、 本来操作できないはずの操作 ( 権限のない ユーザが権限を超えた操作を実行するなど ) がで きてしまったり 、 見えるべきでない情報が第三者 に見えてしまうような不具合をいう 。 ( Wikipedia より )
脆弱性が悪用されると 機密情報が第三者に閲覧される Web サイトの内容が書き換えられる 閲覧者に対してマルウェアを感染させる アカウントの乗っ取りが行われる Web サイトのサービスが利用不能になる クレジットカード情報等の個人情報が抜き取られ る etc...
脆弱性があると駄目な理由 1 経済的損失が大きい 利用者の金銭的損失を補わなくてはならない Web 上のサービスを停止しなくてはならない 信用の損失により 、 売り上げが下がる 金券など迷惑料の支払いにより出費がかさむ
脆弱性があると駄目な理由 2 法的な要求を満たしていない 個人情報の保護に関する法律 ( 個人情報保護法 ) 2003 年 ( 平成 15 年 ) 5 月 23 日成立 第十五 ~ 三十六条 個人情報取扱事業者の義務等 ( 安全管理措置 ) 第二十条 個人情報取扱事業者は 、 その取り扱う個人デー タの漏えい 、 滅失又はき損の防止その他の個人データの安 全管理のために必要かつ適切な措置を講じなければならな い 。 法第二条第三項第五号 ( 個人情報取扱事業者の例外規定 ) 個人情報によって識別される特定の個人の数の合計が過去六 月以内のいずれの日においても五千を超えない者
( 技術的な ) 安全管理措置 個人情報の保護に関する法律についての経済産業分野を 対象とするガイドライン 経産省 個人データへのアクセス 認証 、 制御 、 権限管理 、 記録 個人データを扱う情報システム 不正ソフトウェア対策 、 動作確認時の対策 、 監視 、 移送・送 信時の対策 「 個人データへのアクセス制御 」 を実践するために講じる ことが望まれる手法 個人データを取り扱う情報システムに導入したアクセス制御 機能の有効性の検証 ( 例えば 、 ウェブアプリケーションのぜ い弱性有無の検証 )
脆弱性があると駄目な理由 3 利用者に対してほぼ回復が不可能なダメージを与え る なりすましによる利用者の名誉棄損 情報漏えいに伴う不安や苦痛といった精神的ダメージ 利用者に対して嘘をつくことになる 安全性をうたっていることに対する嘘 攻撃活動の加担 マルウェア感染によって知らない間に迷惑メール送信 や DDoS 攻撃 ( 分散型サービス妨害攻撃 ) などの不正 活動を行う
なぜ脆弱性が生まれるのか ? 開発者のセキュリティに対する知識不足や無責任さから 生じる 脆弱性に対する対策方法を知らない 脆弱性の診断を行っていない とりあえず 、 動けばよいという感じで作っている 納期に間に合わない 作り終えそうなときに仕様変更はめんどくさい 発注者のセキュリティに対する知識不足や開発業者任せ から生じる 仕様書にセキュリティの要件やテスト項目を含めていない セキュリティのテスト結果を確認しないで納品を受領する
開発ライフサイクル 発注者 企画 、 仕様書作成 、 発注 、 納品物受領 、 運用 開発業者 ( 赤枠 ) 受注 、 要件定義 、 設計 、 実装 、 テスト 、 納品
仕様書 発注者の要望を明確化しまとめた文書 物品製造 、 物品売買 、 物品改造 、 作業請負 、 ソフト ウェア製作 、 賃貸借入など Web アプリケーション製作の仕様書には 、 セキュ リティ要件が記載されていないケースがある 。 知らないと書けない 。
定義すべきセキュリティ要件 1. 認証 ( 本人検証 ) 認証・再認証を実施するタイミング 、 パスワードの条 件 、 アカウントロックの利用条件 2. 認可 ( アクセス制御 ) 認証情報・状態をもとにアクセスする条件 3. セッション管理 セッション ID の扱い方 、 セッション ID を破棄するタイ ミング 4. パラメータ パラメータの扱い方 、 入力パラメータの検証 5. 文字列処理 文字列の扱い方 OWASP 「 Web システム / Web アプリケーションセキュリティ要件書 」
定義すべきセキュリティ要件 ( つづき ) 6.HTTPS https の利用条件 、 サーバ証明書の利用 7.Cookie Cookie の扱い方 8. 画面設計 入力や画面遷移などセキュリティ上考慮すべき事項 、 使用禁止の機能 9. その他 エラーメッセージ 、 OS コマンド 、 セキュリティ情報 、 データファイルなどの扱い方 OWASP 「 Web システム / Web アプリケーションセキュリティ要件書 」
HTTPS(Hyper Text Transfer Protocol Secure) セッションを暗号化する HTTP 通信 サーバ証明書で Web サイトが本物であることを確認する 。 暗号化するための鍵の交換し 、 データを暗号化する Web サーバ クライアント Web ブラウザ HTTPS リクエスト HTTPS レスポンス Web サーバ ソフトウェア データ ベース 検索 サーバ証明書 暗号 / 復号鍵
セッションとは セッションは一連のインタラクティブな操作のこと。 典型的には、ログインしてからログアウトするまでが 一つのセッション。 Web サーバ SNS の Web サイトにアクセス ログインページを送付 ログイン ユーザ専用ページを送付 ログアウト ログアウト後のページを送付 クライアント
セッションIDとCookie セッションIDはWebサーバが発行するセッションの識別。 セッション変数はセッションIDと関連パラメータ(ログイ ンIDや日付など)を紐づけした情報を格納する領域 Cookieはブラウザが保持するセッションID。 Web サーバ ログイン情報送信 セッション ID を発行 該当するユーザ専用ページを送付 ログイン済みのアクセス 該当するページを送付 クライアント Web サーバ ID ・パスワード認証 セッション変数格納 セッション ID 検証 Cookie に保存 されたのセッ ション ID を送信 セッション変数参照
静的 / 動的 Web ページ 静的 Web ページ HTML に記述された内容がそのまま表示される 。 クリックなどユーザのアクションによって表示内 容が動的に変わることはない 。 つまり 、 基本的に脆弱性は生まれない 。 動的 Web ページ ( Web アプリケーション ) HTML に記述された内容とは別の内容が表示される 。 ユーザのアクションによって表示内容が動的に変 わる 。 つまり 、 JavaScript や PHP などスクリプトを使っ た Web ページでは 、 脆弱性が生まれやすい 。
Web アプリケーションセキュ リティプロジェクト OWASP(Open Web Application Security Project) Web セキュリティに関する問題を 解決するための国際コミュニティ OWASP Foundation はセキュリティ 専門家によって創立された非営利組織 2001 年から活動開始 、 米国政府認定 NPO 200 以上の拠点に支部がある 国内は OWASP Japan, OWASP Kansai, OWASP Kyushu
基本的な脆弱性 OWASP Top インジェクション A1 認証とセッション管理の不備 A2 クロスサイトスクリプティング( XSS ) A3 安全でないオブジェクト直接参照 A4 セキュリティ設定のミス A5 機密データの露出 A6 機能レベルアクセス制御の欠落 A7 クロスサイトリクエストフォージェリ (CSRF) A8 既知の脆弱性を持つコンポーネントの使用 A9 未検証のリダイレクトとフォワード A10
Web アプリケーションのセ キュリティリスク 攻撃者は多様な潜在的経路で 、 Web アプリケーションを 介して 、 ビジネスや組織に害を及ぼす 。
OWASP Top 10 の順位付け 悪用難易度 、 検出難易度および影響についての世論的推 計と普及度データに基いて選択され 、 順位付けされてい る 。
A1- インジェクション ( 注入 ) 攻撃者がサーバーに SQL 文などを送って想定外の動作をさ せることが可能な脆弱性 SQL インジェクション 、 OS コマンドインジェクション 、 HTML ヘッダインジェクションなど
A2- 認証とセッション管理の不 備 認証およびセッションに関する情報 ( アカウント 、 パス ワード 、 セッション ID ) の管理機能の欠点があることで 情報が漏えいする脆弱性
A3- クロスサイトスクリプティ ング ( XSS ) 攻撃者が脆弱性のある他人の Web サイトに悪意のあるス クリプトを埋め込み 、 Web サイトの利用者にそのスクリ プトを実行させるサイト横断型攻撃が可能な脆弱性
A4- 安全でないオブジェクト直 接参照 Web サイトの公開時にファイル 、 フォルダ 、 データベー ス情報などが誰もでも直接参照できてしまう状態があるこ とで 、 攻撃者にアクセスを許してしまう脆弱性
A5- セキュリティ設定のミス Web サーバや OS の設定のミスによって 、 攻撃者に関連す るシステムのデータや機能に不正アクセスを許してしま う脆弱性
A6- 機密データの露出 機密データを暗号化していない 、 暗号化用の鍵の管理が 甘い 、 弱いアルゴリズムを使用した暗号化など機密デー タの保護対策の不備により機密データが盗まれる脆弱性
A7- 機能レベルアクセス制御の 欠落 Web アプリケーションの機能に対してユーザ権限 、 管理 者権限など適切な権限が保護されていないことで 、 攻撃 者に不正なアクセスを許してしまう脆弱性
A8- クロスサイトリクエスト フォージェリ (CSRF) 攻撃者が脆弱性のある他人の Web サイトに罠のリンクを 埋め込み 、 正規のセッション ID を用いた偽造のリクエス トを送信することで 、 不正な処理を可能にする脆弱性
A9- 既知の脆弱性を持つコン ポーネントの使用 脆弱性があるバージョンのコンポーネントを使い続けて いることで 、 攻撃者にその脆弱性を利用される脆弱性
A10- 未検証のリダイレクトと フォワード Web サーバが別のページに移動を要求するリダイレクト 機能やサーバ内部で別のページに移動させるフォワード機 能が未検証により 、 これらの機能を悪用される脆弱性
過去の脆弱性との違い 注意すべき脆弱性は基本的に変わらない 。 開発段階で脆弱性への対策を施しておくことが大変重要
本日の内容 Webサイトの脆弱性について クロスサイトスクリプティングの脆弱性攻 撃体験と脆弱性の修正 アンケートページの改竄(反射型)
はじめに AppGoat を起動しましょう 。 C:\AppGoat01\IPATool にある start.bat をダブル クリック
次に 「 演習を始める前に 」 のリンクをクリックしましょう 。 「 Smarty について 」 のリンクをクリックしましょう 。
smarty HTML で記述されたテンプレートと呼ばれる雛形 ( 拡張 子は tpl ) と 、 PHP プログラムにより生成されたデータを 合成することで 、 クライアントへの出力を作成するソフ トウェア 処理のロジック部分と HTML のコンテンツ部 分を分離することで、 プログラマーとデザイ ナーの分業が可能
smarty Index.php <?php $smarty = new Smarty(); $smarty->assign(‘title’, ‘Smarty の使 用方法 ’); $smarty->assign(‘msg’, ‘Smarty の 使用方法を記述します 。 ’); $smarty->display(‘index.tpl’); ?> Smarty とは {$title} {$msg} Index.tpl assign 関数でテンプレートファイルへ埋め込まれた該当する変 数への値をセットする display 関数で変数をセットしたテンプレートを表示する
演習をはじめましょう 「 ウェブアプリケーション実習環境へ 」 のリンクをク リックしましょう 。
注意事項を一読しましょう 。 注意事項を一読したら 、「 はい 」 をクリックし 、 同意 しましょう 。 不正アクセス行為の禁止等に関する法律が定められています。 コンピュータやデータの破壊や改ざんには刑事罰が科せられます。 絶対にしないようにしましょう。
演習テーマ クロスサイトスクリプティング 「 アンケートページの改ざん ( 反射型 )」 のリンクを クリックしましょう 。
基本的なの演習の流れ 1. テーマ概説説明 2. 原理解説 3. 演習 4. 影響解説 5. 対策方法解説 6. 脆弱性修正 7. 動作確認 8. 解答例確認 脆弱性攻撃を体験 脆弱性対策を学習
スクリプトとは スクリプト言語とは 、 プログラムの記述や実行を比 較的簡易に行うことができるプログラム言語の総称 。 スクリプトは 、 台本・脚本を意味する 。 JavaScript クライアントの Web ブラウザ上で処理を実行す るスクリプト言語 マウスやキーボードなどユーザからのアクション をきっかけに特定の動作をする動的 Web ページ を作成できる 。
クロスサイトスクリプティング ( XSS ) とは 攻撃者が脆弱性のある他人の Web サイトに悪意のあるス クリプトを埋め込み 、 Web サイトの利用者にそのスクリ プトを実行させるサイト横断型攻撃が可能な脆弱性
クロスサイトスクリプティング の種類 反射型クロスサイト・スクリプティングの脆弱性 ウェブアプリケーションが 、 ユーザからの入力データに含 まれる不正なスクリプトを 、 そのままウェブページに埋め 込んでしまうことによって実行される 。 格納型クロスサイト・スクリプティングの脆弱性 ウェブアプリケーション内部に不正なスクリプトを保存し てしまうことによって 、 ページを閲覧するごとにスクリプ トが実行される 。 DOM ベースのクロスサイト・スクリプティングの脆 弱性 DOM(Document Object Model) を利用しているスクリプ トが 、 DOM ツリーに存在する不正なスクリプトをウェブ ページの表示に利用してしまうことによって実行される 。
反射型クロスサイト・スクリプ ティングの脆弱性の原理 ウェブアプリケーションがユーザから受け取った入力データ を 、 そのままの形 ( 実行可能な形 ) でウェブページの出力に 利用してしまう
反射型クロスサイト・スクリプ ティングの攻撃手口 HTML の文法上特別な意味を持つ特殊文字がそのまま使え ることを利用して 、 表示内容を書き換えるスクリプトを URL に組み込む 。 JavaScript の利用は 、 スクリプトタグを使う 。 ~ : javascript 利 用の宣言 特殊文字 & < > “ ‘
以下の HTML は 、 どんな結果が 表示されるか考えてみよう Index.html window.onload=function(){ document.getElementById("msg").innerHTML = " テストページ "; } Test Page
HTML 要素の中身を変える document.getElementById(“id 名 ”).innerHTML = “ 変更 内容 "; “id 名 ” の付いたタグのテキストを ” 変更内容 ” に書き換える 。 HTML では 、 id 属性で様々なタグに対して ID を付与できる 。 id 付与の注意点 1 つの ID は同じ文書内で重複させてはならない 使用できる文字は 、 半角の英数字 、 ハイフン ( - )、 アン ダーバー ( _ )、 コロン ( : )、 ピリオド (. ) ハイフン以外の記号は使わない方が無難 アルファベットで始めなければならない 。 大文字と小文字は区別される
GET 送信と POST 送信 GET 送信 URL に入力値を含めてデータを送信する 送信できるデータはテキストのみ 宣言しない場合は GET で送信される ( デフォルト ) POST 送信 URL に入力値を含めずデータを送信する 送信できるデータはテキストとバイナリが可能
スクリプトを組み込む場所の一例 ?name=yamada &gender=%E7%94%B7 &age=20 &interest=%E3%81%AF%E3%81%84 &content1=%E5%B0%86%E6%9D%A5%E3%80%81%E3 %82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%8 3%86%E3%82%A3%E4%BC%9A%E7%A4%BE%E3%81% AB%E5%8B%A4%E3%82%81%E3%81%9F%E3%81%84%E 3%81%9F%E3%82%81 &experience=%E3%81%84%E3%81%84%E3%81%88 &content2= document.getElementById("msg ").innerHTML = " テストページ "; タグが表示されない(ばれない) 箇所を特定して組み込む
演習内容 ( 疑似的な攻撃 ) 掲示板にアンケートページの文字を書き換えるスクリプ トを投稿し 、 アンケートページの表記を書き換える 第三者のウェブサイト 掲示板 脆弱性がある ウェブサイト セキュリティに 関するアンケート
演習の進め方 1.Web サイトの挙動を把握する 2. 脆弱性となる箇所を特定する 3. スクリプトを含むコメントを掲示板に投稿する 4. 掲示板にスクリプトを投稿しアクセスする
演習開始 「 演習 」 のリンクをクリックしましょう 。
ページの切り替え 「 脆弱性アンケートアプリ ケーション 」 のボタンをク リックするとアンケート ページが表示されます 。 「 掲示板 」 ボタンをクリッ クすると掲示板ページが表 示されます 。 「 最初のページに戻る 」 ボ タンをクリックすると最初 のアンケートページに戻り ます 。
ソースの確認方法 演習用のページ上で右ク リックをして 「 ソースを 表示 」 または 「 フレーム のソースを表示 」 を選択 。
1. Web サイトの挙動を把握する 掲示板の入力フィールドに 様々な値を入力して動作を 確認する 。 攻撃者として 、 利用できる ことを考える 。 アンケートページに誘導す る投稿内容は ? 不正なスクリプトを含む罠 のリンクをどこに張り付け る ? クリックにより不正なスク リプトを送信する先は ?
1. Web サイトの挙動を把握する アンケートの入力フィー ルドに様々な値を入力し て動作を確認する 。 JavaScript の処理内容と 処理している箇所を把握 しましょう URL も確認してみましょ う
2. 脆弱性となる箇所を特定する のタグをそれぞ れの入力フォームに入力 して投稿してみましょう 。 投稿後に タグが 表示されない ( ばれな い ) 箇所は ?
2. 脆弱性となる箇所を特定する Q&A 掲示板の URL の欄にアンケートページ投稿後の URL を入力 したらどうなりましたか ? アンケートページの名前の入力フォームに の文字 列を入力したらどうなりましたか ?
3. スクリプトを含むコメント を掲示板に投稿する アンケートページの 「 * のついている項目は入力必須 です 。」 の文字列を変更するスクリプトを作成しよう 。 document.getElementById(“id 名 ”).innerHTML = “ 変更内容 "; Id 名をソースコードから特定しましょう 。 Id 名と変更内容を修正してください 。 掲示板に投稿する URL を作成しよう 。 uble=1&content=&name= 作成したスクリプトを追記してください 。
4. 掲示板にスクリプトを投稿 しアクセスする 作成した URL を掲示板の URL フォームに投稿し 、 動 作を確認してください 。
4. 掲示板にスクリプトを投稿 しアクセスする 「 Congratulations!! 演習 の目標を達成しまし た 。」 と表示されたら 、 OK です 。
クロスサイトスクリプティング の一般的な影響 本物のウェブサイト上に偽のウェブページが表示される 偽のウェブページが表示されることで 、 偽情報による混乱を招いた り 、 フィッシング詐欺による情報漏えいが発生したりする可能性が ある ブラウザに保存されている Cookie を取得される Cookie にセッション ID が格納されている場合 、 Cookie を取得され ることで 、 ユーザの成りすましが起き 、 たとえば知らないうちに ショッピングサイトで勝手に商品を購入されてしまう可能性がある 。 Cookie に個人情報などが格納されている場合は 、 その情報が漏え いする可能性がある 。 任意の Cookie をブラウザに保存させられる 任意の Cookie をブラウザに保存させられることで 、 悪意のある人 が取得したセッション ID を何らか方法で送り込まれ 、 ユーザの成り すましにつながる可能性がある 。
対処方法 原因 外部から入力できるパラメータをそのまま使用す るため 、 HTML 上に HTML の文法上特別な意味を持 つ特殊文字があれば 、 そのまま HTML の処理が実行 される 対処方法 特殊文字の意味を打ち消し 、 文字そのものとして 扱うためのエスケープ処理を行う 。
エスケープ処理 特殊文字を HTML で使用可能な文字実体 ( エンティティ ) に置き換えること 例 ) 置換前 alert(‘Hello’) 例 ) 置換後 <script>alert('Hello')</script> 特殊文字 ( 置換前 ) HTML エンティティ ( 置換後 ) && << >> “" ‘'
演習内容 ( 脆弱性の修正 ) アンケートページの反射型クロスサイト・スクリプティ ングの脆弱性となるコードを特定し 、 動的に生成される 文言にエスケープ処理を行う
修正開始 「 脆弱性の修正 」 のリンクをクリックしましょう 。
修正プログラム 掲示板 bbs.php アンケート enquete.php enquete.class.php の処理内容をゲット メッセージ割り当て テンプレート表示 enquete.class.php 集計結果 ( XML データ ) の初期設定 コンストラクタ : オブジェクト生成時 ( enquete.class.php が呼ばれた時 ) に自動的に実行される処理 名前のエラー時の出力に関する処理
htmlspecialchars 関数 特殊文字を HTML エンティティに変換する PHP 関数 htmlspecialchars( 変換対象文字列, エスケープの種類, 文 字コード ) エスケープの種類 ( 一部 ) ENT_COMPAT : ダブルクォートは置き換える 。 シングル クォートは置き換えない ENT_QUOTES : ダブルクォートとシングルクォートの両方 を置き換える ENT_NOQUOTES : ダブルクォートとシングルクォートの両 方を置き換えない 文字コードの種類 ( 一部 ) Shift_JIS UTF-8
PHP の関数 関数とは 、 ある一定の処理をまとめたもの 。 何度も繰り返し行われる一連の作業を関数としてまとめ ておき 、 必要に応じて呼び出して使う 。 組み込み関数 PHP であらかじめ用意されている関数 文字列関数 、 配列関数 、 日付・時刻関数など ユーザ定義関数 ユーザが定義する関数 。
脆弱性の修正の手順 enquete.class.php 1. 名前のエラー時の出力処理の内容の確認 。 2.htmlspecialchars 関数を使用する箇所の特定 。 3.htmlspecialchars 関数を使用したプログラムへの修正 。
1. 名前のエラー時の出力処理 の内容の確認 enquete.class.php public function get_error_name() { $param = $this->get_get(); if (isset($param[parent::NAME])) { return $param[parent::NAME]; } else { return ""; } // リクエストパラメータを取得 // リクエストパラメータに 名前がセットされている場合 isset 関数で変数がセットさ れているか検証している // リクエストパラメータに 名前がセットされていない場合
2. htmlspecialchars 関数を 使用する箇所の特定 enquete.class.php public function get_error_name() { $param = $this->get_get(); if (isset($param[parent::NAME])) { return $param[parent::NAME]; } else { return ""; }
3. htmlspecialchars 関数を 使用したプログラムへの修正 enquete.class.php public function get_error_name() { $param = $this->get_get(); if (isset($param[parent::NAME])) { return htmlspecialchars($param[parent::NAME], ENT_QUOTES, "UTF-8"); } else { return ""; }
動作確認 スクリプトを含む URL を掲示板に投稿してみましょう 。 e.php?page=2&sex=0&old=1&company=&xss=1&tr ouble=1&content=&name= document.getEl ementById(“account”).innerHTML = “ 【 任意の文字 列 】 ”; 投稿した内容がスクリプトが実行されず 、 そのまま文字 として出力されたら OK です 。
反射型クロスサイト・スクリプ ティングの要点 反射型クロスサイト・スクリプティングの脆弱性の原因 は 、 ウェブアプリケーションがユーザから受け取った入 力値を 、 エスケープ処理せずにそのまま使って Web ページに出力することです 。 出力内容が動的に生成される場合は 、 スクリプトが実行 できないようにエスケープ処理をして表示するようにし ましょう 。