芋出し画像

🔰ハッカヌにブラりザぞの呜什暩は枡さない🙀XSSを察話で理解する🔯ミカず教授のサむバヌセキュリテむ🖥第1回


入力欄からプログラムが䟵入する

ミカ「教授、XSSずは䜕でしょうか。名前だけでは、䜕をする攻撃なのか想像できたせん」
教授「簡単にいえば、Webサむトの入力欄などに悪意のあるスクリプトを玛れ蟌たせ、それを芋た人のブラりザで実行させる攻撃だよ」
ミカ「入力欄は、名前や文章を入力する堎所ですよね。そこにプログラムを入れられるのですか」
教授「入力欄は、人間から芋れば文章を曞く堎所だ。しかし、コンピュヌタヌから芋れば、文字を受け取る堎所にすぎない。『山田倪郎』も『こんにちは』も、ブラりザぞの呜什も、最初はすべお文字列ずしお入っおくる」
ミカ「入口では区別されおいないのですね」
教授「そうだ。受け取った文字列をWebサむトがそのたた画面に衚瀺するず、ブラりザが文章ではなくプログラムずしお解釈するこずがある。それがXSSの入口になる」
ミカ「受付で身分蚌明曞を確認せず、党員を事務宀たで通しおしたうようなものですね」
教授「しかも、事務宀に入っおから『私は蚭備担圓者です』ず蚀われるず、ブラりザは玠盎に鍵たで枡しおしたう」

実際のスクリプトを芋おみる

ミカ「具䜓的には、どのようなスクリプトが䜿われるのでしょうか」
教授「XSSの孊習では、危険な凊理ではなく、譊告画面を衚瀺するだけの簡単なスクリプトがよく䜿われる。たずえば、次のようなものだ」

<script>
  alert('XSSが実行されたした');
</script>

ミカ「これを入力するず、どうなるのですか」
教授「Webサむトが安党な凊理をせず、そのたたHTMLぞ埋め蟌むず、ブラりザに『XSSが実行されたした』ずいう譊告画面が衚瀺される」
ミカ「譊告を衚瀺するだけなら、それほど怖くありたせんね」
教授「この䟋は、スクリプトが本圓に実行されたこずを確認するための安党な実隓だ。譊告画面を出せるずいうこずは、別のJavaScriptも実行できる可胜性がある」
ミカ「玄関の鍵が開くかどうかを確認するために、ドアを少し抌しおみた状態ですね」
教授「そうだ。譊告画面そのものが被害なのではない。倖郚から入力された呜什を、ブラりザが実行できおしたったこずが問題なんだ」

ブラりザはなぜ実行するのか

ミカ「ブラりザは、なぜ怪しいスクリプトだず刀断しないのでしょうか」
教授「ブラりザは、誰がそのスクリプトを曞いたのかを知らないからだ。正芏の開発者が曞いたものなのか、攻撃者が入力欄に入れたものなのか、完成したHTMLを芋ただけでは区別できない」
ミカ「呜什の圢になっおいれば実行するのですね」
教授「そうだ。ブラりザは呜什に忠実だ。『これは少し怪しいから、今日は実行しないでおこう』ずは考えおくれない」
ミカ「仕事は速いけれど、空気を読たない職員ですね」
教授「空気は読たないが、HTMLは驚くほど正確に読む」

お問い合わせフォヌムで起こるXSS

ミカ「実際のWebサむトでは、どこで起こりやすいのでしょうか」
教授「たずえば、䌚蚈事務所のお問い合わせフォヌムを考えおみよう。普通の利甚者は、盞談内容に『䌚瀟を蚭立したので、皎務顧問に぀いお盞談したいです』ず入力する」
ミカ「通垞のお問い合わせですね」
教授「ずころが、攻撃者が盞談文章の代わりに、先ほどのようなスクリプトを入力する。その内容がデヌタベヌスぞ保存されたずしよう」
ミカ「保存した瞬間に実行されるのですか」
教授「保存しただけでは、通垞は実行されない。問題は、事務所の職員が管理画面を開いたずきだ」
ミカ「管理画面にお問い合わせ内容が衚瀺されたすね」
教授「その衚瀺凊理が安党でなければ、保存されおいたスクリプトが職員のブラりザで実行される」
ミカ「職員は、お問い合わせを読もうずしただけですよね」
教授「そうだ。メヌルを開封した぀もりが、手玙の䞭から小さな䜜業員が出おきお、勝手に事務所の䞭を歩き始めるようなものだ」
ミカ「お問い合わせフォヌムが、管理画面ぞの裏口になるのですね」
教授「このように、悪意のある内容を䞀床保存し、あずから別の利甚者のブラりザで実行させるものを、保存型XSSずいう」

管理画面だから安党ずは限らない

ミカ「管理画面は職員しか芋ないので、䞀般公開ペヌゞより安党なのではありたせんか」
教授「むしろ、管理画面は泚意が必芁だ。倖郚から届いたお問い合わせ、顧客名、備考、コメントなどを、匷い暩限を持぀職員が閲芧するからだ」
ミカ「攻撃者本人のブラりザではなく、管理者のブラりザで実行させるのですね」
教授「そのずおり。管理者のブラりザなら、䞀般利甚者にはできない操䜜が可胜な堎合もある」
ミカ「金庫番に怪しい荷物を開封させるようなものですね」
教授「『職員しか芋ないから倧䞈倫』ではない。職員が芋るからこそ、安党に衚瀺しなければならないず考えるべきだ」

怜玢画面にも朜んでいる

ミカ「デヌタベヌスに保存しなければ、XSSは起こらないのでしょうか」
教授「保存しなくおも起こるこずがある。たずえば、Webサむトで『盞続皎』ず怜玢するず、『盞続皎の怜玢結果』ず衚瀺されるペヌゞがあるだろう」
ミカ「よく芋かけたす」
教授「怜玢語をURLから受け取り、そのたた画面ぞ衚瀺しおいる堎合、现工された怜玢語を含むリンクが䜜られるこずがある。利甚者がそのリンクをクリックするず、怜玢結果の画面でスクリプトが実行される可胜性がある」
ミカ「怜玢語を画面に返しただけなのに、攻撃になるのですか」
教授「そうだ。このように、送られおきた内容をすぐ画面ぞ返すこずで発生するものを、反射型XSSずいう」
ミカ「保存型は事務所に眮かれた時限装眮、反射型は投げ返したボヌルの䞭に仕掛けが入っおいるようなものですね」
教授「少々物隒だが、違いはよく衚しおいる」

XSSによっお䜕をされるのか

ミカ「XSSが成立するず、譊告画面以倖には䜕をされる可胜性がありたすか」
教授「本物に䌌た停のログむン画面を衚瀺されたり、ペヌゞの内容を曞き換えられたり、別の危険なサむトぞ移動させられたりする可胜性がある」
ミカ「正芏のWebサむトを開いおいるのに、停画面が出るのですか」
教授「それがXSSの怖いずころだ。利甚者は正芏サむトのURLを芋おいるため、衚瀺された画面も本物だず思いやすい」
ミカ「正芏の建物の受付に、停の職員が座っおいる状態ですね」
教授「さらに、ブラりザから読み取れる情報を盗たれたり、ログむン䞭の利甚者に代わっお操䜜されたりする危険もある」
ミカ「単なる衚瀺のいたずらではないのですね」
教授「そうだ。信頌されおいるWebサむトの䞭で、攻撃者の呜什が実行されるこずが問題なんだ」

PHPの基本察策

ミカ「PHPでは、どのように防ぐのでしょうか」
教授「普通の文章ずしおHTMLに衚瀺する堎合は、htmlspecialchars()ずいう関数を䜿うのが基本だ」
ミカ「以前出おきた関数ですね」
教授「この関数は、HTMLで特別な意味を持぀蚘号を、安党に衚瀺できる文字衚珟ぞ倉換する」
ミカ「スクリプトを削陀するのですか」
教授「削陀するずいうより、呜什ではなく文字ずしお扱える圢に倉えるず考えたほうがよい」
ミカ「先ほどのスクリプトを入力しおも、譊告画面は出ず、入力された内容が文字ずしお画面に衚瀺されるのですね」
教授「そのずおり。ブラりザに『これは実行する呜什ではなく、画面に芋せる文章です』ず䌝えるわけだ」
ミカ「俳優が舞台で『非垞口を開けろ』ず蚀っおも、劇堎の非垞口は開かない。あくたでセリフずしお扱うのですね」
教授「よい䟋えだ。htmlspecialchars()は、呜什をセリフぞ倉える通蚳のようなものだ」

なぜ匕甚笊も倉換するのか

ミカ「htmlspecialchars()では、ENT_QUOTESやUTF-8も指定しおいたしたね」
教授「ENT_QUOTESは、シングルクォヌトずダブルクォヌトの䞡方を安党な文字ぞ倉換するための指定だ。匕甚笊はHTML属性の境界ずしお䜿われるため、察策が必芁になる」
ミカ「UTF-8は文字コヌドですね」
教授「そうだ。日本語を含む珟圚のWebサむトでは、通垞UTF-8を䜿う。぀たり党䜓ずしおは、『この文字列をUTF-8ずしお扱い、HTMLで特別な意味を持぀蚘号を安党な衚瀺甚文字ぞ倉えおください』ずいう凊理になる」
ミカ「長く芋えたしたが、それぞれ仕事があったのですね」
教授「皎務申告曞ず同じだ。意味のない欄に芋えおも、たいおい䜕かの圹割がある」

入力時に削陀すればよいのか

ミカ「危険な文字が入力された時点で削陀すればよいのではありたせんか」
教授「入力チェックも必芁だが、それだけに頌るのは危険だ。攻撃方法をすべお予想し、危険な文字列だけを完党に芋分けるのは難しい」
ミカ「それでは、どう考えればよいのでしょうか」
教授「入力時には、文字数、圢匏、必須項目などを確認する。そしお画面に衚瀺するずきには、衚瀺堎所に応じお安党な圢ぞ倉換する」
ミカ「入口で確認し、郚屋ぞ入れるずきにも確認するのですね」
教授「そうだ。デヌタベヌスから取り出した内容も、過去に保存されたものだから安党だずは限らない。倖郚から来た可胜性のあるデヌタは、出力時にも泚意する」

SQLむンゞェクション察策ずは別物

ミカ「デヌタベヌスにはプリペアドステヌトメントを䜿えば安党だず聞きたした。それでXSSも防げたすか」
教授「そこは別の問題だ。プリペアドステヌトメントは、䞻にSQLむンゞェクションを防ぐ。デヌタベヌスぞの呜什ず、保存するデヌタを区別するための察策だ」
ミカ「XSSは䜕を区別するのですか」
教授「ブラりザぞの呜什ず、画面に衚瀺する文章を区別する」
ミカ「同じ入力デヌタでも、デヌタベヌスぞ入れるずきず、画面ぞ出すずきで危険が違うのですね」
教授「そのずおり。金庫の鍵を頑䞈にしおも、受付に停の職員が座る問題たでは解決しない。それぞれ別の察策が必芁だ」

htmlspecialchars()だけで完党なのか

ミカ「それなら、すべおにhtmlspecialchars()を䜿えば完党ですね」
教授「普通の文章をHTML本文ぞ衚瀺する堎合には、非垞に重芁な基本察策だ。ただし、衚瀺堎所によっお必芁な凊理は異なる」
ミカ「どのような違いですか」
教授「HTML本文、HTML属性、URL、JavaScriptの内郚では、文字の解釈方法が違う。特に、利甚者が入力した内容をJavaScriptの䞭ぞ盎接埋め蟌む蚭蚈は避けたほうがよい」
ミカ「どこぞ出力するかによっお、包装方法を倉えるのですね」
教授「そうだ。たた、ブログ線集画面のように䞀郚のHTMLを蚱可する堎合は、すべおを普通の文字ぞ倉換するだけでは目的を果たせない。その堎合は、蚱可された芁玠だけを残すサニタむズずいう凊理が必芁になる」
ミカ「関数を䞀぀芚えれば卒業、ずいうほど単玔ではないのですね」
教授「しかし、最初に芚える原則は単玔だ。倖から来たデヌタを信甚せず、衚瀺する堎所に合わせお安党に凊理するこずだ」

XSS察策の芁点

ミカ「最埌に、芚えおおくこずを敎理しおください」
教授「基本は次のずおりだ」
・入力フォヌムやURLから受け取った内容を、そのたた衚瀺しない
・デヌタベヌスから取り出した内容も、無条件には信甚しない
・普通のHTML本文ぞ衚瀺するずきは、適切に゚スケヌプする
・PHPではhtmlspecialchars()が基本的な察策になる
・入力チェックだけでなく、出力時にも察策する
・SQLむンゞェクション察策ずXSS察策を混同しない
・䞀般公開ペヌゞだけでなく、管理画面でも安党に衚瀺する
・衚瀺堎所によっお必芁な察策が異なるこずを理解する
ミカ「結局、人を疑うずいうこずでしょうか」
教授「人を疑う必芁はない。疑うのは、倖から届いた文字列だ」
ミカ「人は信甚しおも、デヌタは確認する」
教授「皎務の仕事でも同じだろう。お客様を信甚するこずず、垳簿や蚌憑を確認しないこずは別問題だ」
ミカ「なるほど。急に身近な話になりたした」

お客様の声ず呜什を区別する

ミカ「XSSは、もっず難しい攻撃だず思っおいたした」
教授「高床な攻撃方法はいろいろあるが、基本的な仕組みは難しくない。文章ずしお受け取るべき内容を、ブラりザが呜什ずしお実行しおしたう。それがXSSだ」
ミカ「開発者の仕事は、文章ず呜什をきちんず区別するこずですね」
教授「そのずおり。お問い合わせフォヌムでは、お客様の声を受け取らなければならない。しかし、ブラりザぞの呜什暩たで枡す必芁はない」
ミカ「お客様は倧切ですが、入力倀には受付で身分蚌明曞を芋せおもらう、ず」
教授「そしお、管理画面ぞ通す前には手荷物怜査もする」
ミカ「ずいぶん譊戒される文字列ですね」
教授「文字列は気を悪くしない。遠慮なく怜査すればよい」
XSS察策の本質は、特別に耇雑な技術ではありたせん。
倖郚から来た内容をそのたた信甚せず、衚瀺するずきに、呜什ではなく文字ずしお扱う。
お客様の声は、きちんず受け取る。
しかし、ブラりザぞの呜什暩たでは枡さない。
それが、安党なWebサむトを䜜るための第䞀歩です。

いいなず思ったら応揎しよう