脆弱性体験学習ツール AppGoat ハンズオンセミナー ウェブアプリケーション編
講義内容 AppGoat の説明 起動手順 学習の進め方 利用シーン紹介 脆弱性学習 ( 演習あり ) SQLインジェクションの脆弱性 クロスサイト スクリプティングの脆弱性 アンケート記入 2
AppGoat の説明
AppGoat( アップゴート ) とは 本講義では ウェブアプリケーション版の演習環境を使います 教材や演習環境を使って 脆弱性を突いた攻撃が成功する仕組みから実際の対策方法までを学習するツール 教材 : 脆弱性対策に必要な情報を図解したもの 演習環境 : 故意に脆弱性を埋め込んだアプリケーション 下記の 2 種類がある ウェブアプリケーション版 ウェブアプリケーション版 クロスサイト スクリプティングや SQL インジェクションなどを題材とした 15 の学習テーマから構成されている 学習 サーバ デスクトップアプリケーション版 サーバ デスクトップアプリケーション版 バッファオーバーフローや整数オーバーフローなどを題材とした 13 の学習テーマから構成されている 学習 4
学習テーマ一覧 - ウェブアプリケーション版 - ウェブアプリケーション版は 下記表の脆弱性を学習可能 講義内で演習実施 5
起動手順 ( 準備 ) 本講義では お手元にある CD-ROM から ZIP ファイルをコピーします IPA または Vector のウェブサイトから ZIP ファイルをダウンロードします 下記からダウンロード可能です http://www.ipa.go.jp/security/vuln/appgoat/index.html http://www.vector.co.jp/soft/dl/winnt/edu/se488644.html 動画による使い方の解説もあります http://www.youtube.com/watch?v=uuh8jbgtdlc 6
起動手順 ( 手順 1) ZIP ファイルを展開し IPATool フォルダの中にある Start.bat をダブルクリックします 7
起動手順 ( 手順 2) ランタイムのインストール確認ダイアログが表示されますが ウェブアプリケーション環境の演習には必要ないため いいえ を選択します 8
起動手順 ( 手順 3) Windows ファイアウォールの警告ダイアログが表示された場合は ブロックする を選択します 9
起動手順 ( 手順 4) ウェブブラウザが起動し AppGoat の総合メニューが表示されます これでツールが使用可能になりました 10
学習の進め方 左部に表示される テーマ一覧 から学習テーマを選択します あとは 流れに沿って学習を進めていきます 学習テーマ選択後の流れ 脆弱性原理解説 演習 影響解説 対策方法解説 演習のイメージ 脆弱性の発見にチャレンジ! 脆弱性発見! 脆弱性を突いた攻撃が成功する仕組みを体験することで 脆弱性をより理解できます 11
企業での利用シーン紹介 社内のセキュリティ研修で利用する 研修担当者が講師となり ハンズオン形式で教える 開発前のスキルチェックで利用する AppGoat を使った講義の補助資料を公開しています http://www.ipa.go.jp/security/vuln/documents/appgo at_material01.pdf 開発メンバーの理解度を確認する 安全なウェブサイトの作り方 と併せて利用すると効果的です http://www.ipa.go.jp/security/vuln/websecurity.html 12
AppGoat を使う際の注意事項 AppGoat では 脆弱性を埋め込んだ演習環境に対して 疑似的に攻撃します これは攻撃手法を理解して対策につなげるためです 本講義で学習した知識を基に 下記に該当する行為を行わないようにしましょう (1) 第三者のコンピュータシステムの正常な動作に支障をきたす行為 (2) 第三者のウェブサイトへの攻撃行為 13
SQL インジェクションの脆弱性
講義内容 用語の簡易説明 SQLインジェクション脆弱性の概要 演習 :AppGoatを用いた疑似攻撃体験 対策のポイント 15
登場する用語の簡易説明 ウェブアプリケーション ウェブサーバ上で動作するアプリケーション 利用者はウェブブラウザを用いてウェブサーバにアクセスし ウェブアプリケーションを利用する データベース 大量の情報を保存し 効率よく情報にアクセスできるように加工したデータの集まり SQL データベースを管理するシステム (DBMS) において データの操作や定義を行うための問合せ言語のこと 16
SQL インジェクション脆弱性の概要 脅威 データベースへの命令 (SQL 文 ) の意味を書き換えられ データベースを不正に操作されてしまう 原因 情報の改ざんや漏えい 認証の回避 OS コマンドの実行 ウェブアプリケーションにおける データベースへの命令 (SQL 文 ) の組み立て方に問題 注意が必要なウェブアプリケーション データベースを利用しているウェブアプリケーション 17
SQL インジェクション攻撃のイメージ図 SQL インジェクション SQL インジェクションの脆弱性がある場合 悪意あるリクエストにより データベースの不正利用をまねく可能性があります 悪意のある人 ウェブサイト SQL 文の組み立て方に問題 データベースへの命令文を構成する入力値を送信 データベースへ命令を送信 消去 情報漏えい データベース 改ざん SQL インジェクションの脆弱性があるウェブアプリケーション 18
SQL 文の組み立て方に問題があると ID を入力すると 該当するユーザ情報を表示するウェブアプリ SQL 文例 SELECT * FROM user WHERE id= $ID 全て を意味する 1 ID 入力欄に下記文字列を入力しリクエストを送信する john OR A = A 2 SELECT * FROM user WHERE id= john OR A = A john OR A = A ユーザの入力値をもとに SQL 文を組み立て データベースに送信する 悪意がある人 全てのユーザ情報 4 全てのユーザの情報を参照できる ウェブサーバ + ウェブアプリ 3 SQL 文の実行結果をウェブアプリに返す user データベース データベースが不正に操作されてしまう!! 19
攻撃により SQL 文の意味が書き換えられる アプリケーション開発者が想定していた SQL 文 SELECT * FROM user WHERE id=' john 攻撃により 意味が書き換えられた SQL 文 はユーザからの入力値を表す 条件 : Id 列の値と ' で括られた文字列リテラル ( ) が一致する行 SELECT * FROM user WHERE id=' john' OR 'A'='A '; 条件 : Id 列の値と 文字列リテラル john が一致する行または文字列リテラル A と文字列リテラル A が一致する行 ( 常に成立する条件 ) '; SQL 文中の 'john' のような定数をリテラルと呼び 文字列としてのリテラルを文字列リテラルと呼ぶ 数値は数値リテラルと呼ぶ 文字列リテラルは ' で括り 数値リテラルは ' で括らない 20
SQL インジェクション攻撃の脅威 脅威は情報漏えいに限らない データベースを制御され データが作成 / 読み込み / 更新 / 削除される可能性がある Create ( 作成 ): 偽データの追加の脅威 Read ( 読込 ): データの漏えいの脅威 Update( 更新 ): 偽データでの上書きの脅威 Delete ( 削除 ): データの削除の脅威 OS コマンドの実行 ストアドプロシージャ等を利用したOSコマンドの実行の可能性がある 21
SQLインジェクションの脆弱性を取り巻く状況 クレジットカード番号や個人情報の漏えい 音響機器 楽器販売サイト 健康食品や医薬品販売サイト 化粧品販売サイト 雑貨販売サイト ウイルス感染などを引き起こすウェブサイトの改ざん ウイルス対策ソフト開発会社 自動車情報サイト 政府関連のウェブサイト 22
[ 演習 ]AppGoat を用いた疑似攻撃体験 [ 時間 ]30 分 ( 解説含む ) AppGoat を起動し SQL インジェクションの下記テーマの演習を実施してください 不正なログイン ( 文字列リテラル ) 画面上に Congratulations!! と表示されると演習クリアです クリアした方は 下記テーマの演習に挑戦してみてください 情報漏えい ( 数値リテラル ) 23
[ 演習 ] 演習環境へのアクセス方法 AppGoat 起動後 1 学習テーマを選択し 2 パンくずリストの 演習 をクリックします 24
[ 演習 ] 演習の進め方 下記のように ウェブアプリケーションがどのように SQL 文を組み立てているのか 想像しながら演習問題を解いてみましょう 前提条件 ボタンを押下し どのような SQL 文が使用されているか確認する 様々な値でログインを試み ウェブアプリケーションの挙動を確認する ログイン ID に yamada パスワードに P@ssword を入力する ログイン ID パスワードともに yamada を入力する 入力欄のいずれかにシングルクォート ' を入力する 25
[ 演習 ] 行き詰まった場合 問題を解くのに行き詰まった場合は AppGoat のヒント機能を参考に演習を進めてください AppGoat のヒント機能 不明な点がございましたら お気軽にお声掛けください ( または挙手 ) 補助講師が伺います 26
[ 演習解説 ] 演習解説は 別紙を参照してください 別紙は 演習時間終了後に閲覧するようにしてください 27
SQL インジェクション脆弱性の対策 根本的解決 脆弱性の原因を作り込まない実装 SQL 文の組み立て時に パラメータの値を正しくリテラルとして展開する SQL 文の組み立ては全てプレースホルダで実装する SQL 文の組み立てを文字列連結により行う場合は エスケープ処理等を行うデータベースエンジンの API を用いて SQL 文のリテラルを正しく構成する 保険的対策 攻撃による影響を軽減する対策 詳細なエラーメッセージの抑止 データベースアカウントの権限見直し 脆弱性の原因そのものを無くす対策ではない 28
根本的解決 プレースホルダによる SQL 文の組み立て パラメータを? などの記号で示しておき 後に そこへ実際の値を機械的な処理で割り当てる方法のこと 記号? をプレースホルダと呼び そこへ実際の値を割り当てることを バインドする と呼ぶ プレースホルダを用いることで SQL インジェクション攻撃により SQL 文の構文を変化させられないようにする PreparedStatement prep = conn.preparestatement("select * FROM employee WHERE name=?"); prep.setstring(1, " 山田 "); バインドする プレースホルダ Java 29
根本的解決 プレースホルダの種類 バインドをいつ行うのかによって 下記の2 種類に分けられる 静的プレースホルダ データベース側がバインド処理 後から SQL 文の構文が変化することがなく 原理的に SQL インジェクションの可能性がない 動的プレースホルダ 静的プレースホルダを推奨 ウェブアプリケーション側のライブラリ内でバインド処理 ライブラリの実装にバグがあった場合は 攻撃により SQL 文の構文を変化させられてしまう可能性を否定できない 30
静的プレースホルダ使用時の SQL 文実行の流れ 静的プレースホルダ 利用者 ウェブサイト ウェブアプリケーション データベース SELECT *FROM table WHERE id = and passwd = SELECT *FROM table WHERE id = and passwd = =satou, =a15t =satou, =a15t SELECT *FROM table WHERE id = satou and passwd = a15t 実行結果 実行結果 =takana, =vri5 実行結果 =takana, =vri5 SELECT *FROM table WHERE id = takana and passwd = vri5 実行結果 31
プレースホルダの使用例 ( 根本的解決 ) 静的プレースホルダを使用 (PHP + PostgreSQL) <?php require_once 'MDB2.php';// ライブラリのロード $db = MDB2::connect('pgsql://username:password@hostname/dbname'. '?charset=utf8'); if(pear::iserror($db)) { // エラー処理 } $stmt = $db->prepare('select * FROM atable WHERE name=? and num=?', array('text', 'integer'), array('text', 'text', 'integer')); $rs = $stmt->execute(array($name, $num)); // 文字列型と整数型の変数 if(pear::iserror($rs)) { // エラー処理 } // 以下は検索結果の表示 while($row = $rs->fetchrow()) { printf("%s:%s:%s n", $row[0], $row[1], $row[2]); } 参考 : 安全なSQLの呼び出し方 P.19 MDB2を用いたSQL 呼び出しのサンプルコード 32
保険的対策 攻撃による影響を低減する対策 詳細なエラーメッセージを表示しないようにする 詳細なデータベースに関するエラーメッセージをウェブページに表示させない エラーを表示するとしても 内容は最小限にする データベースアカウントの権限見直し 権限全部入り のアカウントは使わない 既存のテーブルを読み書きするだけなのに テーブル操作や管理等の権限はいらない 権限を必要最小限にすれば 防げる攻撃もある その他の対応 収集する情報および データベースに格納する情報を見直す ウェブサイト利用者のパスワードはそのまま保存しない 33
対策のおさらい SQL 文の組み立て時には プレースホルダを使用して パラメータを正しくリテラルとして展開する その他の対策は 安全なウェブサイトの作り方 安全な SQL の呼び出し方 を参照 安全なウェブサイトの作り方改訂第 5 版 別冊 : 安全な SQL の呼び出し方 http://www.ipa.go.jp/security/vuln/websecurity.html 34
クロスサイト スクリプティングの脆弱性
講義内容 用語の簡易説明 クロスサイト スクリプティング脆弱性の概要 実習 :AppGoatを用いた疑似攻撃体験 対策のポイント 36
登場する用語の簡易説明 HTML ウェブページを記述するためのマークアップ言語 文書の一部を < と > で挟まれた タグ と呼ばれる特別な文字列で囲うことにより 文章の構造や修飾についての情報を文書に埋め込んで記述することができる Cookie ウェブサーバとウェブブラウザ間で状態を管理するために使われる 例えば ウェブサイトの訪問回数や ユーザ認証後の状態を管理するために使われる 37
クロスサイト スクリプティング脆弱性の概要 脅威 出力するウェブページ (HTML) を書き換えられ ウェブページを操作されてしまう 原因 本物サイト上に偽のページが表示される Cookie を取得される等 ウェブページ出力 (HTML 生成 ) の実装に問題 注意が必要なウェブアプリケーション 動的にウェブページを出力するウェブアプリケーション 38
クロスサイト スクリプティング攻撃の イメージ図 罠ページや罠リンクへのアクセスから 利用者が被害を受ける 悪意のある人が用意した罠ページ 1-a. 罠とは知らず 悪意あるサイトの罠ページを閲覧 利用者のブラウザ ウェブサイト クリック! 悪意のある人 1-b. 罠リンクを含むメールを送信 利用者のメーラ リンク 2. クリック等により スクリプトを含む文字列を送信 ウェブアプリケーション Cookie 漏えい 5. スクリプトの内容によっては Cookie 情報などが漏えい 利用者 スクリプト実行 偽ページの表示 4. 利用者のブラウザ上でスクリプトが実行 3. スクリプトを含むウェブページを出力 HTML 生成の実装に問題 39
HTML 生成の実装に問題があると 正常系 利用者 異常系 利用者 検索キーワード IPA 3 IPA を含む検索結果 検索キーワード <s>ipa</s> 3 IPA を含む検索結果 1 1 2 ウェブサーバ + ウェブアプリ <s> は 取り消し線を引く HTML タグ 2 ウェブサーバ + ウェブアプリ <html> IPA IPA を含む検索結果 </html> <html> <s>ipa</s> を含む検索結果 </html> "<" および ">" が出力され HTMLタグとして認識されてしまう ( 表示が崩れる ) 40
攻撃により HTML を書き換えられる アプリケーション開発者が想定していた HTML HTML ソース <html> IPA IPA を含む検索結果 </html> 攻撃により 書き換えられた HTML HTML ソース <html> <s>ipa</s> を含む検索結果 </html> ウェブブラウザ IPA を含む検索結果 ウェブブラウザ IPA を含む検索結果 攻撃により <script> タグとして認識させた場合には 利用者のウェブブラウザ上で任意のスクリプトが実行されてしまう 41
HTML を書き換えられてしまうと 偽情報の表示 悪意あるサイトへの誘導 なりすましにつながる情報の窃取 42
クロスサイト スクリプティング攻撃の脅威 本物サイト上に偽のページが表示される 偽の情報の流布による混乱 フィッシング詐欺による重要情報の漏えい アドレスバーに表示されているドメインは正規のものであるため 利用者が罠と気付きにくい ブラウザが保存している Cookie を取得される Cookie にセッション ID が格納されている場合 さらに利用者への成りすましにつながる 任意の Cookie をブラウザに保存させられる セッションIDが利用者に送り込まれ セッションIDの固定化 攻撃に悪用される 43
クロスサイト スクリプティングの脆弱性を取り巻く状況 脆弱性による被害や騒動があったサイト 動画共有サービス ミニブログサイト バグ管理システム ウェブメール クラウドを使ったデータ管理サービス IPA に届け出られたクロスサイト スクリプティングの脆弱性は 2300 件以上 (2011 年 3 月末 ) 44
[ 演習 ]AppGoat を用いた疑似攻撃体験 [ 時間 ]30 分 ( 解説含む ) AppGoat を起動し クロスサイト スクリプティングの下記テーマの演習を実施してください アンケートページの改ざん ( 反射型 ) 画面上に Congratulations!! と表示されると演習クリアです クリアした方は 下記テーマの演習に挑戦してみてください 掲示板に埋め込まれるスクリプト ( 格納型 ) 45
[ 演習 ] 演習環境へのアクセス方法 AppGoat 起動後 1 学習テーマを選択し 2 パンくずリストの 演習 をクリックします 46
[ 演習 ] 演習の進め方 下記のように ウェブアプリケーションがどのように HTML を生成しているのか 想像しながら演習問題を解いてみましょう アンケートページで様々な値を入力し 入力内容確認ページやエラーページを表示させる アンケートページで入力した値が どのように HTML に反映されているか確認する Internet Explorer アンケートページ上で右クリックし ソースを表示 でHTMLソースを表示する Firefox アンケートページ上で右クリックし このフレーム フレームのソースを表示 でHTMLソースを表示する 47
[ 演習 ] 行き詰まった場合 問題を解くのに行き詰まった場合は AppGoat のヒント機能を参考に演習を進めてください AppGoat のヒント機能 次のスライドの財団法人地方自治情報センター (LASDEC) の資料抜粋 ( 項番 2.4) を参照ください 脆弱性の検出パターンや脆弱性有無の判定基準の目安が記載されています ウェブ健康診断 - 財団法人地方自治情報センター (LASDEC) 平成 22 年度版ウェブ健康診断仕様 Internet 公開用 https://www.lasdec.or.jp/cms/resources/content/1284/h22_web_kenko_shindan.pdf 48
[ 参考 ] 平成 22 年度版ウェブ健康診断仕様 ( 抜粋 ) 地方自治体向けの脆弱性有無確認の参考資料 平成 22 年度版ウェブ健康診断仕様 Internet 公開用 https://www.lasdec.or.jp/cms/resources/content/1284/h22_web_kenko_shindan.pdf 49
[ 演習解説 ] 演習解説は 別紙を参照してください 別紙は 演習時間終了後に閲覧するようにしてください 50
クロスサイト スクリプティング脆弱性の対策 HTML テキストの入力を許可しない場合 - 根本的解決 HTML における特別な記号文字をエスケープ処理する URL 出力時のスキームを制限する スクリプト要素の内容を動的に生成しない - 保険的対策 入力値チェックをする HTML テキストの入力を許可する場合 - 根本的解決 構文解析木を作成して 必要な要素のみを抽出する - 保険的対策 入力された HTML テキストから スクリプトを除く 全てのウェブアプリケーションに共通の対策 文字コードを正しく指定する 検索や情報登録等の機能を有するアプリ 掲示板やブログ等のアプリ 51
エスケープ処理 (HTML 不許可 / 根本的解決 ) HTML における特別な意味を持つ 記号文字 を文字参照に置換 (HTML を許可しない場合 ) 例 : & & < < " " > > ' ' 入力値 :<script>alert("test");</script> 置換後 : <script>alert("test");</script> 52
エスケープ処理 (HTML 不許可 / 根本的解決 ) エスケープ処理なし HTMLソース <input type="text" id="test" value=""><script>alert('ipa');</script>" /> ウェブブラウザ上の表示 エスケープ処理あり script タグとして解釈された HTMLソース <input type="text" id="test" value=""><script>alert('ipa');</script>" /> ウェブブラウザ上の表示 Input タグの value 属性の値と解釈された 53
そもそもエスケープ処理って? HTML や SQL の構文毎に異なる 特別な意味を持つ 記号文字 ( 特殊記号 ) を " 文字そのもの " として扱うために行う処理 HTML における特殊記号は < " ' & など SQL における特殊記号は ' _ % など 特殊記号の中でも データの区切り を表す記号をエスケープすることが セキュリティ上重要 HTML におけるデータの区切り記号は < " など SQL におけるデータの区切り記号は ' など 54
入力値チェックの位置づけ ( 保険的対策 ) 入力値チェックとは 利用者が入力した値の書式を確認することが主目的 例 : パスワードの長さや使用可能な文字種のチェック電話番号やメールアドレスの書式チェック 脆弱性による被害を低減する役割を果たすことがあるが 入力値チェックだけでは防げない 参考 : 脆弱性体験学習ツール AppGoat クロスサイト スクリプティングの 不完全な対策 55
[ 参考 ] ウェブブラウザ側のクロスサイト スクリプティング対策 ウェブブラウザには クロスサイト スクリプティング攻撃を防ぐ XSS フィルタ 機能が備わっているものがある XSS フィルタの検知ロジックは様々 誤検知や検知しない可能性もある 根本的には ウェブアプリケーション側で対策する必要がある 56
対策のおさらい ウェブページを出力する際には HTML における特別な意味を持つ記号文字をエスケープすることが必要 ウェブサイトの性質によってエスケープ方法が異なる場合がある 詳しくは 安全なウェブサイトの作り方 を参照 安全なウェブサイトの作り方改訂第 5 版 http://www.ipa.go.jp/security/vuln/websecurity.html 57
最後に 脆弱性が生まれる原理や対策方法の理解を深めるために AppGoat を使ってウェブアプリケーションの挙動を確認しました 脆弱性対策を学習するために AppGoat を活用いただけましたら幸いです セミナー講師が脆弱性対策を教える際の補助ツールとして 社内への脆弱性対策の教育に アプリケーション開発者に対する脆弱性対策学習を支援するツールとして 58
アンケート記入 お疲れ様でした AppGoat に対する要望や意見を収集するために IPA のアンケートにご協力お願いします 59