サイバーセキュリティ演習 ― Webセキュリティ基礎&実践― 5. 不正スクリプトの実行対策 講義内容 1. 2*. Webサイトの仕組みとWebプログラミング基礎 3.4.5*. 不正スクリプトの実行対策 6.7*. データベースの不正操作対策 8 *. システムの不正操作対策とHTTPレスポンスの改竄対策 9 *. 偽リクエストによるサービスの不正利用対策 10*. セッションIDの 不正取得対策 11. 総合演習(1) 12*. 公開ディレクトリの不正横断対策と認証認可制御の欠落 による不正アクセス対策とエラーメッセージからの情報 漏えい対策 13. 総合演習(2) 14. 総合演習(3) 15. 学期末試験 ※*はレポートがある回になります。 本日の内容 クロスサイトスクリプティングの脆弱性攻 撃体験と脆弱性の修正 ウェブページの改竄(DOMベース) 不完全な対策 クロスサイトスクリプティング の種類 反射型クロスサイト・スクリプティングの脆弱性 ウェブアプリケーションが、ユーザからの入力データに含 まれる不正なスクリプトを、そのままウェブページに埋め 込んでしまうことによって実行される。 格納型クロスサイト・スクリプティングの脆弱性 ウェブアプリケーション内部に不正なスクリプトを保存し てしまうことによって、ページを閲覧するごとにスクリプ トが実行される。 DOMベースのクロスサイト・スクリプティングの脆 弱性 DOM(Document Object Model)を利用しているスクリプ トが、DOMツリーに存在する不正なスクリプトをウェブ ページの表示に利用してしまうことによって実行される。 演習テーマ クロスサイトスクリプティング 「ウェブページの改ざん(DOMベース)」のリンク をクリックしましょう。 DOM(Document Object Model)とは HTML文書をクライアントサイドのスクリプトから利 用するための標準化された仕様の一つ。 ブラウザで動作するJavaScriptは、DOMツリーを用 いてHTML文書の内容を操作(読み書き)することで、 HTML文書を構成する要素を動的に変更することがで きる。 昔はブラウザごとに制御方法が違っていたため、 ブラウザごとに専用の JavaScript のコードを用 意する必要があった。 制御方法を統一するために DOM という仕様が生まれ た。 HTMLとDOMの関係 HTMLは、「要素(HTMLタグ)」「属性」「テキス ト」、「ドキュメント」といった部品で構成されて いる。 DOMは、これらの部品をノードと呼ばれる「もの (オブジェクト)」として階層的な構造(DOMツ リー)で識別し、スクリプト(JavaScript等)か ら、扱いたいノードを特定し操作できるようにする 仕組みを提供する。 HTMLの例 <html> <body> <h1 id=“title”>アンケート ページ</h1> <a id=“url“ href=“survey.html ”>クリック</a> <div id=“deadline></div> </body> </html> 【表示】 アンケートページ クリック http://example.jp/survey.html h属性:見出しを h1(大)-h6(小)の6段階で記述する a属性:hrefプロパティで指定したURLを設定する div属性:段落を作成する DOMツリーの例 Document 要素node html 要素node body 要素node 要素node 要素node h1 a div 属性node id=title text node アンケー ト 属性node 属性node text node 属性node id=url href=surve y.html クリック id=deadli ne 例えば、「survey.html」のURLを、ア タッカーページのURLに変更したいとき ① Document 要素node html 要素node 【JavaScritp】 ①document. ②getElementById(‘url'). ③href = “http://localhost/Web/Scenario 105/attackers_page.php”; body 要素node ② h1 要素node 要素node a div ③ 属性node text node 属性node 属性node text node 属性node id=title アンケー ト id=url href=surv ey.html クリック id=deadli ne 例えば、 「12月末締切」という文字列 を追加したいとき Document 要素node html 要素node body 【JavaScritp】 ① var text = document.createTextNode("12 月末締切"); ② document.getElementById("de adline").appendChild(text); 要素node 要素node 要素node h1 a div ② 属性node text node 属性node 属性node text node 属性node text node id=title アンケー ト id=url href=surv ey.html クリック id=deadli ne 12月末締 ①切 変更後のHTMLの例 <html><head><script type="text/javascript"> window.onload=function(){ document.getElementById("url").href="http://localhost/Web/Scenario105/attackers_page.php"; var text = document.createTextNode("12月末締切"); document.getElementById("deadline").appendChild(text);} </script></head> <body id="body"> <h1 id="title">アンケートページ</h1> <a id="url" href="survey.html">クリック</a> <div id="deadline"></div> </body></html> http://localhost/Web/Scenari o105/attackers_page.php DOMベースのクロスサイトス クリプティングの原理 ウェブアプリケーションがユーザから受け取った入 力データを、そのままの形(実行可能な形)でウェ ブページの出力に利用してしまう。 反射型と原理は同じ 演習内容(疑似的な攻撃) 掲示板にウェブ検索サイトの検索結果のURLを書き換え るスクリプトを含んだ罠のリンクを貼り付け、検索結果 のURLの変更を確認する 第三者のウェブサイト 掲示板 脆弱性がある ウェブサイト ウェブ検索サイト 演習の進め方 1. Webサイトの挙動を把握する 2. 脆弱性となる箇所を特定する 3. スクリプトを作成する 4. スクリプトを掲示板に投稿する 5. スクリプト投稿後の動作を確認する 1.Webサイトの挙動を把握する 検索の入力フィールドに 様々な値を入力して動作 を確認する。 検索後のソースから JavaScriptの処理内容と 処理している箇所を把握 しましょう URLも確認してみましょ う 検索結果について 決められたワードと解説をランダムに出力しています。 以下のファイルを参照してみましょう。 C:\AppGoat01\IPATool\Scenarios\Common\Sear ch\Lang\ja 検索後のURL 検索後のURLに検索キーワードが代入されています。 入力値は、以下のように投稿後のURLの末尾にある?以降 に出力され、各要素は&で連結されています。 http://localhost/Web/Scenario105/VulSoft/search.php ?keyword=abc &submit=%E6%A4%9C%E7%B4%A2 &page=1 %E6%A4%9C%E7%B4%A2⇒検索ボタンの「検索」 1.Webサイトの挙動を把握する JavaScript function get_keyword() { var param = location.search; param = param.replace(/\+/g, decodeURIComponent(" ")); var re = /(\?|&)keyword=([^&]*)/; return re.exec(param)[2]; } (続きは次ページ) 現在URLを参照しURLの”+”の箇所をス ペースに復号化 • replace(/ 変換前文字/g, 変換後文字); • \で+をエスケープ処理(文字実体化) している “keyword=“の前に?または&があり、 “keyword=“以降に &を含まない文字列を抽出し配列として返す 1.Webサイトの挙動を把握する JavaScript (つづき) 検索キーワードの文字を復号化して表示 try { var keyword = get_keyword(); document.write(decodeURIComponent(keyword)); } catch(e) { try { var keyword = get_keyword(); document.write(keyword); } catch(e) {} } 例外的なエラーが出た場合、復号化せずに表示 2.脆弱性となる箇所を特定する <sの文字をそれぞれの入 力フォームに入力して投 稿してみましょう。 クエリ文字列の表示はど うなりますか? 3.スクリプトを作成する 検索結果のURLを以下のURLに変更するスクリプトを 作成しましょう。 http://localhost/Web/Scenario105/attackers_page .php <script>document.getElementById(“id名”).href =“変 更URL";</script> ソースコードからaタグのidの付け方を確認しましょう。 id名と変更URLを修正してください。 4.スクリプトを掲示板に投稿 する 掲示板に投稿するURLを作成しよう。 http://localhost/Web/Scenario105/VulSoft/search. php?page=1&submit=1&keyword=<作成スクリプト > 作成したスクリプトを追記してください。 作成したURLを掲示板のURLフォームに投稿し、動作 を確認してください。 http://localhost/Web/Scenario105/VulSoft/search.php? page=1&submit=1&keyword=<script>document.getEle mentById('link0').href='http://localhost/Web/Scenario105 /attackers_page.php';</script> 5.スクリプト投稿後の動作を 確認する 「Congratulations!!演習 の目標を達成しまし た。」と表示されたら、 OKです。 URLが書き換わっているこ とも確認してください。 対処方法 原因 外部から入力できるパラメータをそのまま使用す るため、 HTML上にHTMLの文法上特別な意味を持 つ特殊文字があれば、そのままHTMLの処理が実行 される 対処方法 特殊文字の意味を打ち消し、文字そのものとして 扱うためのエスケープ処理を行う。 JavaScriptによるエスケープ 処理 JavaScriptには、PHPのhtmlspecialchars関数のよう にエスケープ処理をしてくれる関数はない JavaScriptの場合は、DOMのappendChild関数と createTextNode関数を利用することによって、入力さ れたデータを文字実体として扱うことができる かなり手間となるが、JavaScriptにエスケープ処理をす る関数を独自に組み込むのも一つの手である。 演習内容(脆弱性の修正) ウェブ検索サイトのDOSベースのクロスサイト・スク リプティングの脆弱性となるコードを特定し、動的に生 成される文言にエスケープ処理を行う 修正の前に 動作確認用のウェブ 検索サイトの検索後 のページのソース コードを確認してみ ましょう スクリプトを実行 する段落の<div>タ グのid が”query_string”で あること確認して ください。 少しソースコードが変わっています 修正プログラム ウェブ検索サイト search.php search.class.phpを読み込み実行 search.jsのJavaScriptファイル指定 メッセージ割り当て テンプレート表示 search.js URLからキーワードの抽出 キーワードの表示 脆弱性の修正の手順 search.js 1. JavaScriptの内容確認。 2. キーワードを表示する箇所の特定。 3. エスケープ処理を行うプログラムの修正。 1. JavaScriptの内容確認 function get_keyword() { var param = location.search; param = param.replace(/\+/g, decodeURIComponent(" ")); var re = /(\?|&)keyword=([^&]*)/; return re.exec(param)[2]; } try { var keyword = get_keyword(); keyword = decodeURIComponent(keyword); document.write(keyword); } catch(e) {} 2.キーワードを表示する箇所 の特定 function get_keyword() { var param = location.search; param = param.replace(/\+/g, decodeURIComponent(" ")); var re = /(\?|&)keyword=([^&]*)/; return re.exec(param)[2]; } try { var keyword = get_keyword(); keyword = decodeURIComponent(keyword); document.write(keyword); } catch(e) {} 3.エスケープ処理を行うプロ グラムの修正 function get_keyword() { var param = location.search; param = param.replace(/\+/g, decodeURIComponent(" ")); var re = /(\?|&)keyword=([^&]*)/; return re.exec(param)[2]; } try { var keyword = get_keyword(); keyword = decodeURIComponent(keyword); var text = document.createTextNode(keyword); document.getElementById(‘query_string’).appendChild(text); } catch(e) {} 動作確認 スクリプトを含むURLを掲示板に投稿してみましょう。 http://localhost/Web/Scenario105/EditSoft/search. php?page=1&submit=1&keyword=<script>docume nt.getElementById('link0').href='http://localhost/We b/Scenario105/attackers_page.php';</script> 投稿したスクリプトが実行されず、そのまま文字として 出力され、検索後のURLが変更されていなければOKで す。 DOMベースクロスサイト・ス クリプティングの要点 DOMベースクロスサイト・スクリプティングの脆弱性 の原因は、JavaScriptなどのスクリプトのコードに問題 があり受け取ったデータを、エスケープ処理せずにその まま使ってWebページを出力することです。 JavaScriptを用いてHTMLを動的に書き換える場合は、 スクリプトが実行できないようにDOMの関数 (appendChild関数・createTextNode関数)を使用 してエスケープ処理を行ってから表示するようにしま しょう。 演習テーマ クロスサイトスクリプティング 「不完全な対策」のリンクをクリックしましょう。 クロスサイトスクリプティング の入力チェック対策の回避事例 入力値のチェック機能が入力フォームだけを想定してい る場合、アドレス欄などから不正なスクリプトが入力さ れることで、チェックを回避されてしまう可能性がある。 演習内容(疑似的な攻撃) 掲示板の内容を書き換えるスクリプトを含むURLをアド レス欄に入力し、掲示板の表記を書き換える 脆弱性がある ウェブサイト 掲示板 演習の進め方 1. Webサイトの挙動を把握する 2. スクリプトを作成する 3. スクリプトを含むURLをアドレス欄に入力する 4. ページ遷移後の動作を確認する 1.脆弱性となる箇所を特定する <sの文字をそれぞれの入 力フォームに入力して投 稿してみましょう。 <sの文字をURLのそれぞ れの入力フォームに入力 して投稿してみましょう。 投稿後のHTMLソースも 確認しましょう。 投稿後に<sが表示されな い(ばれない)箇所は? 2.スクリプトを作成する 「管理者の発言:このページでは、決して誹謗中傷な どは行わないでください。」の内容を変更するスクリ プトを作成しよう。 document.getElementById(“id名”).innerHTML = “変 更内容"; “id名”の付いたタグのテキストを”変更内容”に書き換える。 ソースから該当箇所のid名を確認しましょう。 id名と変更内容を追記したスクリプトを作成しましょう。 3.スクリプトを含むURLをア ドレス欄に入力する アドレス欄に入力するURLを作成しましょう。 http://localhost/Web/Scenario106/VulSoft/bbs.php?na me=1&title=1&url=&content=<作成スクリプト> 作成したスクリプトを追記してください。 作成したURLをアドレス欄に入力しましょう。 http://localhost/Web/Scenario106/VulSoft/bbs.php ?name=1&title=1&url=&content=<script>document .getElementById("warning").innerHTML="管理者の発 言:このページでは誹謗中傷を歓迎します。";</script> 4.ページ遷移後の動作を確認 する 「Congratulations!!演習の目標を達成しました。」 とアラートが表示されたら、OKです。 対処方法 原因 外部から入力できるパラメータをそのまま使用す るため、 HTML上にHTMLの文法上特別な意味を持 つ特殊文字があれば、そのままHTMLの処理が実行 される 対処方法 特殊文字の意味を打ち消し、文字そのものとして 扱うためのエスケープ処理を行う。 修正プログラム 掲示板 bbs.php メッセージ割り当て テンプレート表示 bbs.class.php 掲示板投稿内容の初期設定 データベース情報を表示形式に変換 演習課題の成功判定に関する処理 bbs.js 投稿ボタン押下時の処理 タグ文字のチェック 削除ボタン押下時の処理 脆弱性の修正の手順 bbs.class.php 1. データベースのデータ表示形式変換処理の内容の確認。 2. htmlspecialchars関数を使用する箇所の特定。 3. htmlspecialchars関数を使用したプログラムへの修正。 1.データベースのデータ表示 形式変換処理の内容の確認 public function get_contents() { $this->_contents["contents"] = array(); while($row = $this->stmt->fetch()) { $content = array(); foreach($row as $k => $v) { $value = null; 「掲示板に埋め込まれるスクリプト(格納 型)」テーマの「脆弱性の修正」リンクに あるbbs.cloass.phpファイルの get_contents()関数と同じです。 詳細は、格納型XSSの第4回講義資料を参照 してください。 if ($k == parent::CONTENT) { $value = nl2br($row[$k]); $this->is_success($value); } else { $value = htmlspecialchars($row[$k], ENT_QUOTES, "UTF-8"); } $content[$k] = $value; } $this->_contents["contents"][] = $content; } $this->_contents["token"] = AppGoatUtil::getToken(); return $this->_contents; } 2.htmlspecialchars関数を 使用する箇所の特定 foreach($row as $k => $v) { $value = null; if ($k == parent::CONTENT) { $value = nl2br($row[$k]); $this->is_success($value); } else { $value = htmlspecialchars($row[$k], ENT_QUOTES, "UTF-8"); } $content[$k] = $value; } 3.htmlspecialchars関数を 使用したプログラムへの修正 foreach($row as $k => $v) { $value = null; if ($k == parent::CONTENT) { $value = nl2br(htmlspecialchars($row[$k], ENT_QUOTES, "UTF-8")); $this->is_success($value); } else { $value = htmlspecialchars($row[$k], ENT_QUOTES, "UTF-8"); } $content[$k] = $value; } 動作確認 スクリプトを含むURLをアドレス欄に入力してみましょ う。 http://localhost/Web/Scenario106/Editsoft/bbs.p hp?name=1&title=1&url=&content=<script>docu ment.getElementById("warning").innerHTML="管理 者の発言:このページでは誹謗中傷を歓迎します。 ";</script> 入力したスクリプトが実行されなければOKです。 クロスサイト・スクリプティン グのまとめ 間接的攻撃の反射型、直接的攻撃の格納型のクロスサイ ト・スクリプティングがあり、罠のリンクに誘導しスク リプトを実行させる、あるいは入力欄やURL欄に直接ス クリプトを投稿するなど攻撃方法は多様です。 しかしながら、クロスサイトスクリプティングの原因は いずれも同じで、受け取った入力値を、エスケープ処理 せずにそのまま使ってWebページに出力することです。 外部の入力パラメータを使って出力内容が動的に生成さ れる場合は、スクリプトが実行できないようにエスケー プ処理をして表示するようにしましょう。 課題 実際に、クロスサイトスクリプティングの 脆弱性を突かれて被害を受けた事件を調査 し、1)被害の内容と時期、2)攻撃方法 とその攻撃で可能だったこと、3)脆弱性 が生まれた原因、4)実施された対策につ いて、参考にした情報源などを引用しつつ 簡潔にまとめてください。 本講義の感想、要望、質問などあれば、書 いてください。 https://moodle.artsci.kyushu-u.ac.jp/course/view.php?id=2661
© Copyright 2024 ExpyDoc