XSS脆弱性自動修正プログラムの作成

神奈川大学理学部情報科学科 2013 年度学士論文要旨
指導教員:松尾和人
XSS 脆弱性自動修正プログラムの作成
学籍番号 2010
1
はじめに
青柳 貴大
注入することで画面の書き換えを行うことができる。こ
Web アプリケーションの脆弱性を利用した攻撃にはク
ロスサイト・スクリプティング (XSS)、SQL インジェク
れを利用して攻撃者は罠サイトにユーザを誘い込み、罠
ション、OS コマンドインジェクションなどがある。その
る。ユーザは攻撃の意思が無いにも関わらず脆弱なサイ
中でも XSS はメジャーな攻撃の一つである。XSS は Web
トを攻撃したことになる上、画面の書き換えによりユー
アプリケーションの表示処理の脆弱性を利用した攻撃で
ザは騙され正当な画面と思い込み個人情報などを入力し、
ある。XSS に対する脆弱性を検査するには XSS そのもの
奪われてしまう可能性がある。XSS の主な攻撃には以下
に関する知識や、どのようなものが脆弱になるのかとい
の種類がある。
サイトから脆弱なサイトに悪意のあるフォームを注入す
• クッキー値の盗み出し
• JavaScript による攻撃
• 画面の書き換え
う知識が必要であり、さらに脆弱性を調べる手間やツー
ルが必要となる。
XSS 攻撃においては、Web アプリケーションの開発者
が脆弱性の有無を正確に確認しなければ、悪意がなくと
も攻撃者に脆弱性を悪用されユーザに被害が出てしまう
可能性がある。XSS 攻撃による被害を増やさないために、
脆弱性のチェックを行い、修正することは重要な課題で
ある。
そこで本研究では、Web アプリケーション作成に一般
的に利用される PHP ファイルを読込み、XSS 脆弱性を
自動で修正して出力するプログラムを作成する。これに
より専門な知識を必要とせずに XSS 脆弱性のない PHP
ファイルを作成することができ、XSS 攻撃の被害を受け
ない安全なサイトを作成することができる。
2
XSS
2.1 XSS によるクッキー値の盗み出し
攻撃者によって脆弱なサイトの外部から注入された
JavaScript によりクッキーにセットされたセッション ID
などを読みだす。攻撃者は得たセッション ID を悪用し
て成りすましが可能になる。
2.2 JavaScript による攻撃
攻撃者が脆弱な Web アプリケーションの日記のよう
な機能を利用し、XSS ワームを送り込みユーザの意図し
ないところで JavaScript によって書き込みが行われてし
まう。Twitter での感染者のプロフィールを自身にコピー
するワームなど、犯人の目的によっては利用者の個人情
報を収集したり、偽の書き込みを送信したりなどができ
にクロスサイトスクリプティング(XSS)がある。XSS 攻
るため、潜在的に大きなリスクなり得る。
2.3 画面の書き換え
XSS 脆弱性はログイン機能のないサイトでも影響があ
撃とは Web アプリケーションのデータ処理において発生
る。脆弱なサイトでは攻撃者が HTML のタグや文字列
する問題を利用する攻撃である。Web アプリケーション
を入力することで自由にページを改ざんすることができ
には外部から入力に応じて変化する箇所があり、その箇
るため手に入れたい情報を入力する欄を作成するなどし
所の HTML 生成において、特殊文字を文字列として解
て個人情報を得ることができる。
表示処理が原因で発生するセキュリティの問題の 1 つ
釈するための処理であるエスケープ処理がなされていな
攻撃例として JavaScript を使わない XSS の攻撃では、
い場合、入力された文字をタグや構文としてを読み込ん
攻撃用フォームの submit ボタンをリンクに見せかける
でしまい、ブラウザ上で意図しない動作が実行されてし
ようにスタイルを指定する。また、罠サイトではリンク
まう。被害を受けるのは脆弱な Web アプリケーションの
に見せかけたボタンがあり、クリックすると元のフォー
ユーザである。攻撃者が設置した罠サイトをユーザが閲
ムを隠し新たなフォーム要素を追加することにより画面
覧するとユーザを介して悪意のあるスクリプトが脆弱な
を改変する。この場合本来の場合個人情報を入力するだ
Web フォームに書き込まれてしまい、ユーザのブラウザ
上でそのスクリプトが実行される。その結果 Web アプ
けのページにクレジットカードの番号の入力欄やそれら
リケーション上のユーザデータなどが攻撃者に奪われて
しまう。例えばログイン機能があるサイトに XSS 脆弱性
があると、ユーザはセッション ID など個人情報を奪わ
れてしまう可能性がある。さらにログイン機能がないサ
イトの場合でも、脆弱なサイトに悪意のあるフォームを
しい誘導の言葉が新たに追加されてしまう。
3
XSS 対策
XSS 脆弱性が発生する主な原因は HTML を作成する
際のエスケープ漏れである。正確にエスケープすること
が XSS 脆弱性の対策となる。
神奈川大学理学部情報科学科 2013 年度学士論文要旨
指導教員:松尾和人
PHP でアプリケーションを開発する場合には HTML
のエスケープ処理を行うために htmlspetialchars 関数が
利用できる。
3.1 エスケープ
HTML 文の中では文法上特別な意味を持つ特殊記号
(メタ文字) がある。メタ文字を使用すると文字ではなく
ないようにした。これは htmlspetialchars の中に html-
特別な意味として処理してしまう。そのため HTML タグ
存在する場合、プログラムによって htmlspetialchars 関
を含む文字列を文字列として出力したい場合はエスケー
数で囲うことができた。結果セッション ID 盗み出しの
プ処理を行ってから出力する必要がある。エスケープ処
攻撃を受けないことが確認できた。
spetialchars があると構文エラーになるからである。
4.2 実験
作成したプログラムを [1] で紹介されている脆弱な PHP
ファイルに適用し、動作確認を行った。
ログイン機能のある PHP ファイルでは、対象文字が
理とはメタ文字の持つ特別な意味を打ち消し、文字その
入力欄に脆弱性がある PHP ファイルでは、攻撃用の
ものとして扱えるようにすることである。
3.2 HTML エスケープ
ここでは HTML において文字参照によりエスケープ
フォームを入力することで画面の書き換えを行うことが
すべき記号を述べる。HTML では以下の文字の置き換え
を行うことで XSS を防ぐことができる。
• <→ &lt;
• >→ &gt;
• & → &amp; • ” → &qout;
• ’ → &#39;
PHP で HTML のエスケープ処理を行うには htmlspetialchars 関数が利用できる。htmlspetialchars 関数
ではフォームに入力された文字リテラルに対し、上記置
換を自動的に行う。
4
XSS 脆弱性の修正プログラム
検査ツールでは脆弱な部分を発見することができるが
実際に脆弱な部分を修正することはできない。本研究で
は Web アプリケーションの開発では一般的である PHP
ファイルを読み込み、脆弱性を排除して出力するプログ
ラムを作成する。
4.1 プログラムの作成
プログラムに用いた言語は Python 言語である。Python
の正規表現を用いることで、脆弱な部分の検索、修正が
実現可能である。
PHP の場合、脆弱となる HTML の要素内容に対し
て htmlspetialchars 関数を用いることで対策を取るこ
とができる。実際には PHP ソース中の$POST, $GET,
$COOKIE を自動的に htmlspetialchars 関数で囲えばよ
い。
Python 言語の re モジュールは正規表現オブジェクト
に対応する関数を提供し、compile 関数が pattern 文字
列を解析し、正規表現オブジェクトを生成して返す。そ
こで compile 関数を用いて対象となる$GET, $POST,
$COOKIE を検索し htmlspetialchars 関数で囲う範囲の
条件設定を行った。発見した$GET, $POST, $COOKIE
を htmlspetialchars 関数で囲って修正したものに置き換
えを行うことで元のファイルの修正を行う。但し、元の
状態で$GET, $POST, $COOKIE の文字の前に html-
spetialchars 関数が存在する場合には置き換えを実行し
できる。罠ページからリンクに見せかけたボタンを押す
と画面書き換えが起こる攻撃用のフォームが注入される
が、対象の PHP ファイルをプログラムによって修正後、
サイトから攻撃用の画面変更のフォームを注入してみた
ところ、画面の書き換えは起こらなかった。また罠ペー
ジから攻撃のフォーム注入のボタンを押した場合でも画
面の書き換えは起こらなかった。
さらに XSS 脆弱性検査ツールの XSS Me を使用して、
修正したサイトをチェックし、脆弱性が修正されている
ことを確認した。
以上より読み込んだ PHP ファイルに対象文字が存在
する場合修正を行うことが確認できた。
5 まとめと課題
XSS 攻撃の対策として PHP ファイルに対して XSS 脆
弱性を修正するプログラムを作成した。しかし、XSS 攻
撃の方法は他にも多くあり、実際にこのプログラムで脆
弱性の全てを防げるわけではない。例として JavaScript
の文字リテラルの動的生成のに対する攻撃は防ぐことが
できない。この場合の脆弱性を生み出さない方法として、
JavaScript 文字列リテラルをエスケープしなければなら
ない。JavaScript エスケープに対応することが今後の課
題である。
参考文献
[1] 徳丸浩, “安全な Web アプリケーションの作り方”, ソフト
バンククリエイティブ, 2011.
[2] 中安恒樹, 山本知典, 上原雄貴, 武田圭史, 慶応義塾大学環境
情報学部, 慶応義塾大学大学院政策・メディア研究科, “Web
アプリケーションによるクロスサイトスクリプティング検
査の提案と実装”, コンピュータセキュリティシンポジウム
2011 論文集, 2011.
[3] 柴田文彦, “Python プログラミング入門”, 株式会社ローカ
ス, 2011.
[4] 金床, “ウェブアプリケーションセキュリティ”, 株式会社
データハウス, 2007.
[5] Alex Martelli, “Python クイックリファレンス”, 株式会社
クリーブ, 2004.
[6] 佐名木智貴, “セキュア Web プログラミング Tips 集”, 株式
会社ソフト・リサーチ・センター, 2008.
[7] Jeremiah Grossman, Robert”RSnake” Hansen, Petko
”pdp” Petkov, Anton Rager, Seth Fogie , “XSS Attacks
CROSS SITE SCRIPTING EXPLOITS AND DEFENS”,
Syngress, 2007.