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