Dreamweaver使いが 知っておきたいセキュリティ

Dreamweaver使いが
知っておきたいセキュリティ
株式会社ビジネス・アーキテクツ
太田 良典
かんたんな自己紹介
私の所属
• 株式会社ビジネス・アーキテクツ (bA)
• 大規模企業サイトの構築を得意とする
– 戦略から設計、実装までお付き合いします
– 「ただ言われたとおりページを作るだけ」ではない
3
仕事でやっていること
• マークアップデザインエンジニア
– HTML や CSS の設計、ガイドライン
• 弊社内では、変な HTML を書くと私に怒られるという
都市伝説がある
– Webアクセシビリティ
• 企業の「アクセシビリティ指針」策定
– ユーザビリティ
• サイト設計 / UI 設計 /情報設計諸々
4
こっそりやっていること
• 脆弱性の発見と届出
– 経済産業省の「情報セキュリティ早期警戒パート
ナーシップ」の制度を利用していろいろ届出
5
届出の例
• それなりに報道された
りしたケースも
6
届出件数
• 届出件数 : たぶん150件くらい
– 国内の届出は約1000件なので、シェア約15%
– ウェブアプリケーションの届出に絞るとシェア20%
超
• 第2回IPA賞 (情報セキュリティ部門) 受賞
– 理由 : 届出件数日本一
受賞したりしている時点で、もう「こっそり」で
はなくなっていますが……。
7
本題の前に
おねがい
• 情報を不正アクセスから守るためには、攻撃
側の手法を知る必要があります
• そのため、この話の中にも攻撃手法の解説
が出てきますが、絶対に悪用しないでください
• 不正アクセス行為は、法令によって処罰され
ることがあります
9
本題
お話の流れ
•
•
•
•
DreamweaverのPHPサンプル
脆弱性とは?
脆弱性事例の紹介
おわりに
11
DreamweaverのPHPサンプル
13
できました!
14
入力してみると……
15
表示されました
16
サンプルフォームの問題
その1
もっとコメントしてみる
18
拡大
19
表示されましたが……
20
何かがおかしい
21
そのときのソース
22
拡大
• <table> がそのままソース中に出力されている
• これが table要素の開始タグとして解釈された
• 本当は <table> という文字を表示してほしかった
23
サンプルフォームの問題
その2
こんなことを書いてみる
25
拡大
26
異変が!!
27
そのときのソース
• 今度は <script …… と書き込まれている
• script要素として解釈されてしまい、alert() がスクリ
プトとして実行された
• 任意のスクリプトを書き込むことが出来てしまう
28
alert() が出るだけなら害はない?
• alert() が 10000回実行されたらどうか
– ダイアログが出ているとブラウザを閉じることもで
きない
– 俗に言う「ブラクラ」
• 利用者の Cookie を読み取って別のサイトに
送ることもできる
– Cookie にセッションID が含まれていた場合、漏
洩するとセッションハイジャックの危険がある
29
サンプルフォームの問題
その3
今度はこう書いてみる
31
拡大
32
そのときのソース
• 今度は <iframe …… と書き込まれている
• 属性によって、幅・高さ共に100%に設定
• すると……
33
その結果
34
結論
• Dreamweaver のチュートリアルで作られるサンプ
ルフォームは、悪用される危険がある
– サンプルフォームをそのまま公開する人はいないと思い
ますが……
– 同じような作り方をしてしまうと危険
これは
クロスサイトスクリプティング脆弱性
と呼ばれる問題
35
修正する
原因
• 入力された文字をそのまま出力している
• 「<」が入力されてもそのまま出力
– 「<」はタグの開始区切り子として使用される文字
• 「<……」が入力されると、HTMLのマークアッ
プとして解釈されてしまう
37
対策
• HTML のマークアップとして解釈されるおそ
れがある文字を出力しない
• 3つの方法
– 文字を削除する
– 文字を置き換える
– エスケープする
38
文字を削除する
• 「<」を削除してしまう方法
• 「<table>が……」→table>が……
• 利用者が意図した表示にならないことがある
– コメントに < が含まれることはあり得る。
– たとえばプログラムの話題。「if (a <= 0)」と書くと、
「if(a = 0)」と表示されてしまう
– HTML の話題にも支障が出る
39
文字を置き換える
• 「<」を別な文字に置き換えてしまう方法
– たとえば全角の「<」
• 「<table>が……」→<table>が……
• いちおう表示されるが、やはり利用者が意図
した表示にならないことがある
• かっこ悪い
40
文字をエスケープする
• 文字参照を使用すると、「<」をマークと認識さ
れないように表示することができる
– 文字実体参照 &lt;
– 数値文字参照 &#60; もしくは &#x3e;
– 文字実体参照を使用するのが一般的
• 利用者の入力したままが表示される
41
修正対応
• 文字をエスケープするのが望ましい
• PHP の場合、エスケープのための関数
htmlspecialchars() が用意されている
• 以下を変換
– 「<」→&lt;
– 「>」→&gt;
– 「”」→&quot;
– 「&」→&amp;
42
コードの修正
44
修正箇所
• echo で値をそのまま出力している
45
修正後
• htmlspecialchars() を追加
46
使用前・使用後
47
脆弱性とは?
ぜいじゃくせい
×きじゃくせい (危ではありません)
×だじゃくせい (惰? あまり似ていませんが)
×もうじゃくせい (もはや誤読の原因不明)
49
経済産業省告示第二百三十五号
「ソフトウエア等脆弱性関連情報取扱基準」
1.脆弱性
ソフトウエア等において、コンピュータウイル
ス、コンピュータ不正アクセス等の攻撃により
その機能や性能を損なう原因となり得る安全
性上の問題箇所。ウェブアプリケーションに
あっては、ウェブサイト運営者がアクセス制御
機能により保護すべき情報等に誰もがアクセ
スできるような、安全性が欠如している状態
を含む。
50
「脆弱性」まとめ
• 読みは「ぜいじゃくせい」
• 情報セキュリティの分野では、ソフトウェアな
どのセキュリティ上の問題点を指す
– 「セキュリティホール」も同義
• 「ソフトウェアの脆弱性」のほか、
「Webアプリケーションの脆弱性」というものも
ある
51
ソフトウェアの例 : OS
52
ソフトウェアの例 : ワープロソフト
53
Webアプリケーションの例
54
届出件数
出典:
独立行政法人 情報処理推進機構 セキュリティセンター (IPA/ISEC)
有限責任中間法人JPCERTコーディネーションセンター(http://www.jpcert.or.jp/)
55
脆弱性の印象と実際
• ニュース等で目にするのはソフトウェアの脆
弱性の方が多い
• しかし、実際にはWebアプリケーションの脆
弱性の方がたくさん発見されている
56
脆弱性事例の紹介
事例1 : TBCのケース
∼フォースフル・ブラウジング∼
59
事件の概要
61
アクセスしてみると
• 書き込みにある URL
http://www.tbc.co.jp/cgi/
にアクセスすると、ファイル一覧が表示された
62
ファイル一覧の例 (別のサイト)
63
そして
• 一覧を見ていくと、多数のCSV ファイルを発
見
• CSVファイルにアクセス制限などはなく、誰で
もアクセスできた
• さまざまなデータが格納されていた
– アンケートのデータ
– 求人応募のデータ
etc.
64
手法の解説
「フォースフル・ブラウジング」
「フォースフル・ブラウジング」とは
• 無理やり(forceful) 閲覧 (browsing)。
• 閲覧されることを意図していないものを、強制
的に閲覧する手法
66
具体的な方法
• ブラウザのアドレスバーに URL を入れる
以上。
67
フォースフル・ブラウジングの原理
• ブラウザのアドレスバーに URL を入れれば、
その URL にアクセスできる
– あたりまえですが……
• どこからもリンクされていない URL であって
も、管理者がアクセスされることを想定してい
ない URL であっても、自由にアクセスできる
「リンクされていないから見られないはず」
という判断は NG
68
注意点
注意点
• 公開ディレクトリに重要なデータファイルを置
かないこと!!
– 特に CGI プログラムの設計時に注意
• サーバ移行時の罠にも要注意
– 今までは見られなかったディレクトリが……
– cgi-bin にも置かないほうが良い
70
Dreamweaver の場合
71
事例2 : カカクコムのケース
∼ SQLインジェクション∼
73
事件の概要
75
事件の経緯(1)
• アンチウイルスソフト NOD32 のユーザがサ
イトにアクセスすると、ウイルス警告が表示さ
れた
• サイトトップページがひそかに改竄され、ウイ
ルスが仕込まれていたことが判明
• のちに、ユーザのメールアドレス約25000件
が漏洩していたことも判明
76
事件の経緯(2)
• 中国からの留学生が逮捕され、カカクコムへの不正
アクセスを認める
• ただし、この留学生は閉鎖の直接原因ではない
– 閉鎖の原因となった攻撃の犯人は不明
• 以前から大量の不正アクセスが行われていた模様
– 「実際には単一の犯人ではなく、入れ替わり立ち代わり異
なる犯人による小規模のハッキングを受けてきたことが
明らかになってきた」
• 「備える心」が大事――カカクコムのインシデントから得られた教訓
http://www.itmedia.co.jp/enterprise/articles/0507/27/news020.html
77
その後
• カカクコムは事件の詳細を
公表していない
• 報道、インタビューその他
の情報によれば、
「SQLインジェクション」
によるものだったと言われ
ている
78
手法の解説
「SQLインジェクション」
SQLインジェクションとは
• SQL = Structured Query Language
– データベースに問い合わせを行うための言語
• Injection = 注射、注入
• SQL文の中に悪意あるデータを「注入」するこ
とで、SQL文の内容を改竄する手法
80
起きることの例
•
•
•
•
•
不正なログイン
本来は取得できないはずのデータを取得
データの消去
データの改竄
サーバ上で任意のコマンドを実行
– xp_cmdshell 拡張ストアドプロシージャ
何でもあり、とてつもなく危険
81
SQLインジェクションの原理
SQL文の例
SELECT * FROM user
WHERE user=‘admin’ AND pass=‘root’
• SELECT * FROM user
– 「user」という名前のテーブルから全データを取得
• WHERE user=‘admin’ AND pass=‘root’
– user, pass の値が特定の条件を満たすものに絞り込む
• 結果、 user が admin で pass が root になってい
るレコードのデータだけが得られる
83
ところで……
SELECT * FROM user WHERE
user=‘admin’ AND pass=‘root’
• ユーザがフォームから入力した値は、
「’」(単引用符、シングルクォート)
で括られた状態で SQL文に入ってくる
84
単引用符を入れてみると……
SELECT * FROM user
WHERE user=‘Let’s Note’ AND pass=‘’
• 入力されたのが引用符だったため、引用符の
対応関係がおかしくなっている
– ちなみに「’Let’’s Note’」とする必要があります
• 結果、不正な SQL 文となってエラー
85
さらに……
SELECT * FROM user
WHERE user=‘’ OR 1==1--’ AND pass=‘’
• 「--」の後ろはコメントとみなされて無視される
ため、以下の SQL 文と等価になる
SELECT * FROM user
WHERE user=‘’ OR 1==1
86
その結果
SELECT * FROM user
WHERE user=‘’ OR 1==1
• これは、user=‘’ が成立するか、あるいは
1==1 が成立するレコードを取ってくる
• 1==1 は常に成立するので、全てのレコード
が取得できる
非常にまずい感じの誤動作
87
注意点
注意点
• プログラム中で SQL 文を組み立てたりしな
いのがベスト
– Prepared Statement によるバインドメカニズム
を使用する
• それが無理なら、確実にエスケープする
– 「’」→「’’」 「¥」→「¥¥」
– DB に応じてさまざまな変換関数がある
• たとえば mysql_real_escape_string()
• しかし、いろいろ難しい……
89
Dreamweaverの場合
90
事例3 : Yahoo! メールのケース
∼クロスサイトスクリプティング∼
92
ログイン後
• Web上でメールを読ん
だり書いたりできる
• HTMLメールも表示で
きる
93
事件の概要
事件1 : フィッシング
• 普通は、アドレスバーを
見たりすれば偽サイト
を識別できる
• しかし、本物サイト上で
フィッシングを行う「巧
妙」な手口が出現
95
事件2 : ウイルスメール
• Yahoo! メールを狙った
ウイルスメールが発生
96
手法の解説
クロスサイトスクリプティング
フィッシングの手口
• 攻撃者は、スクリプトを含む HTML メールを
送信
• メールを表示すると、攻撃者のスクリプトが実
行され、ページの内容がひそかに改竄される
– iframe要素が挿入され、yahoo!メールの本物サ
イトの中に攻撃者の用意したコンテンツが表示さ
れた
– ブラウザのアドレスバーの URL は本物のまま
98
ウイルスメールの手口
• メールを開くと、やはりスクリプトが実行される
• そして、自動的に他のユーザにメールを送信
してしまう
• そのメールにもやはりスクリプトが……。
増殖
99
何故スクリプトが動いた?
• 通常、HTMLメールに含まれるスクリプトは実
行されないようにする必要がある
• Yahoo!メールでも、原則としてスクリプトは実
行されないような処理をしていた
• しかし、その処理に欠陥があり、スクリプトが
実行されてしまった
100
クロスサイトスクリプティングとは
• Cross Site Scripting / XSS
– 「CSS」と略すと Cascading Style Sheet と混同
されるので「XSS」と呼ぶ
• ウェブサイト上に外部からスクリプトを挿入さ
れ、そのスクリプトが動作してしまうこと
– 攻撃者の用意したスクリプトが、ターゲットのドメ
イン上で実行される
– 広義には、スクリプトを含んでいない HTML の改
竄も含む
101
何がまずいのか
• 普通、スクリプトで別ドメインのコンテンツを操
作することはできない
• XSS脆弱性があるとターゲットのドメイン上で
スクリプトが動くので、さまざまな攻撃ができ
てしまう
– フィッシング
– 不正な操作 (ウイルスメール送信)
– Cookie読み出しによるセッションハイジャック
102
注意点
注意点
• 外部から入力された値をそのまま HTML に
出力しないこと!
• 文字参照に変換すればだいたい OK
– 「<」→「&lt;」 「>」→「&gt;」 「”」→「&quot;」
「&」→「&amp;」
• PHP の場合、htmlspecialchars()
– addslashes() では駄目! (というか意味が無い)
• 文脈によってはさらに難しい場合も……
104
特に難しい場合
• HTMLメールを「安全に」表示するのは非常
に難しい!!
• スクリプトが動作するような記述は無数にあ
るが、その全てを考慮する必要がある
– イベントハンドラ、javascript: スキーム、url()
• ブラウザの挙動まで考慮する必要がある
– expression() 、全角の expression()
105
Dreamweaverの場合
106
おわりに
知っておいてほしいこと
• Dreamweaver を使うと、PHP のアプリケー
ションがとても簡単に作れる
• しかし安全に動くものを作るとなると、
必ずしも簡単ではない
• 脆弱性のあるアプリケーションを公開し、
悪用されると大変なことが起きる
• 公開するアプリケーションは、
安全性に注意して実装するべき
108
おすすめサイト (技術情報)
• 安全なウェブサイトの作り方 改訂第2版
– http://www.ipa.go.jp/security/vuln/websecurity.
html
• IPA ISEC セキュア・プログラミング講座
– http://www.ipa.go.jp/security/awareness/vend
or/programming/
• SecurIT 産業技術総合研究所 グリッド研究
センター セキュアプログラミングチーム
– http://securit.gtrc.aist.go.jp/
109
昨日の常識は今日の非常識
• 次々に発覚する脆弱性
• どんどん出現する新手法
• 時代の変遷、手法の変遷
常に最新情報を追う必要がある
110
どうやって情報を集めるか
• 主に Webサイト
– やはり Web サイトの方が情報が早い
– Webのセキュリティに関しては、そもそも Web サ
イトが一次情報源であることが多い
• セキュリティ系、ITニュース系のサイトをこま
めにチェックするのが吉
111
おすすめサイト (最新情報)
セキュリティホール memo
http://www.st.ryukoku.ac.jp/~kjm/security/
memo/
• いろいろな情報を網羅、他サイトへのリンクが
中心
• 興味が出てきたら、少しずつリンク先のサイト
をチェックするようにすると良い
112
ありがとうございました