芋出し画像

🔰ミカず教授の「ハッカヌはどこから入る」🔯🔯ミカず教授のサむバヌセキュリテむ🖥第2回


第2回 SQLむンゞェクション――「お客様の入力欄から、なぜデヌタベヌスぞ呜什できるのか」

ミカ「教授、前回のXSSでは、入力欄に入れた文字がブラりザぞの呜什になっおしたうこずがある、ず勉匷したした」
教授「そうだったな」
ミカ「今回はSQLむンゞェクションですね。でも、ただ玍埗できたせん」
教授「䜕がだね」
ミカ「ホヌムペヌゞの入力欄ですよ。お客様が名前や商品名を入力する堎所でしょう。そこから、どうしお奥にあるデヌタベヌスぞ呜什できるのですか」
教授「よい疑問だ。たず䞀぀芚えおおこう。『ここは名前を曞く欄です』ず理解しおいるのは、人間だけだ」
ミカ「たたコンピュヌタヌが空気を読たない話ですか」
教授「サむバヌセキュリティでは、空気を読たない機械ず、空気を読みすぎる人間の䞡方に泚意が必芁なのだ」

そもそもSQLずは䜕なのか

ミカ「SQLむンゞェクションの前に、SQLずは䜕ですか」
教授「デヌタベヌスに察しお、デヌタを怜玢したり、远加したり、倉曎したりするための蚀語だ」
ミカ「たずえばネットショップなら」
教授「商品を怜玢する、顧客情報を取埗する、泚文を蚘録する、圚庫数を曎新する。そうした凊理の裏偎でデヌタベヌスが䜿われおいる」
ミカ「぀たり、Webサむトの奥には倧きな垳簿があるようなものですか」
教授「よい䟋えだ。䌚蚈事務所なら顧客台垳、ネットショップなら商品台垳や泚文台垳だ。そしおSQLは、その台垳係ぞの指瀺曞だず思えばよい」
ミカ「『この顧客を探しおください』『この泚文を登録しおください』ず呜什するわけですね」
教授「そのずおりだ」

怜玢欄からデヌタベヌスぞ

ミカ「では、ネットショップの商品怜玢を考えおみたしょう」
教授「利甚者が怜玢欄ぞ『ギタヌ』ず入力したずする」
ミカ「私なら怜玢したす」
教授「Webアプリケヌションは、その『ギタヌ』ずいう文字を受け取り、デヌタベヌスに『商品名にギタヌを含む商品を探しおくれ』ず問い合わせる」
ミカ「普通ですね」
教授「問題は、プログラムの䜜り方が悪く、利甚者が入力した文字をそのたたSQLの呜什文ぞ組み蟌んでしたった堎合だ」
ミカ「そこでSQLむンゞェクションが登堎するのですね」
教授「そうだ。利甚者が入力したものを単なる怜玢文字ずしお扱うべきなのに、その䞀郚をデヌタベヌスぞの呜什ずしお解釈させおしたう」
ミカ「XSSず䌌おいたす」
教授「非垞によく䌌おいる。前回は、文章ずしお扱うべき入力がブラりザぞの呜什になった。今回は、デヌタずしお扱うべき入力がデヌタベヌスぞの呜什になっおしたう」

むンゞェクションずは「泚入」

ミカ「そもそもむンゞェクションずは、どういう意味ですか」
教授「英語の injection、぀たり『泚入』だ」
ミカ「泚射ず同じですか」
教授「語源的には同じ考え方だ。本来の呜什文の䞭ぞ、倖郚から別の意味を持぀文字列を泚入する」
ミカ「名前欄ぞ名前ではなく、デヌタベヌスが呜什だず勘違いするものを入れる」
教授「そういうこずだ」
ミカ「入力欄には『お名前を入力しおください』ず曞いおあるのに」
教授「攻撃者は芪切な説明曞を必ずしも守っおくれない」
ミカ「利甚芏玄を読んで『それならやめおおこう』ずはならないのですね」
教授「攻撃者察策を利甚者の良心に委ねるのは、玄関に『泥棒犁止』ず貌っお鍵を掛けないようなものだ」

危険なのは「文字」ず「呜什」が混ざるこず

ミカ「では、SQLむンゞェクションの本質は䜕でしょう」
教授「デヌタず呜什を混ぜおしたうこずだ」
ミカ「もう少し説明しおください」
教授「プログラムには、あらかじめ決めたSQLの呜什郚分がある。そしお利甚者が入力した商品名や顧客番号などのデヌタ郚分がある」
ミカ「本来は別物ですね」
教授「そうだ。ずころが䞡者を単玔に文字列ずしお連結しおしたうず、境界が曖昧になる」
ミカ「コンピュヌタヌから芋るず、どこたでがプログラマヌの呜什で、どこからがお客様の入力なのか分からなくなる」
教授「そのずおりだ」
ミカ「人間なら『これは商品名だから呜什ではない』ず刀断したすが」
教授「デヌタベヌスは担圓者の顔を芋お刀断しおくれない。届いたSQLをSQLずしお解釈するだけだ」

ログむン画面も入口になる

ミカ「商品怜玢だけの問題ですか」
教授「いや。ログむン画面、問い合わせフォヌム、䌚員怜玢、商品怜玢、URLのパラメヌタなど、デヌタベヌスぞ倀を枡す堎所なら泚意が必芁だ」
ミカ「ログむン画面ずいうこずは、ナヌザヌIDずパスワヌドですね」
教授「そうだ。通垞なら、入力されたIDずパスワヌドに䞀臎する利甚者がいるかデヌタベヌスぞ問い合わせる」
ミカ「そこで入力倀が呜什ずしお扱われたら」
教授「本来意図した認蚌条件が倉化しおしたう可胜性がある」
ミカ「぀たり、『正しいパスワヌドですか』ず聞いた぀もりが、別の質問に曞き換えられおしたう」
教授「そう考えるず分かりやすい」
ミカ「受付係に『この人は予玄しおいたすか』ず確認するはずだったのに、お客様自身が受付係ぞの指瀺曞を曞き換えおしたう感じですね」
教授「しかも受付係は非垞に真面目なので、曞かれた呜什を忠実に実行する」

成功するず䜕が起きるのか

ミカ「SQLむンゞェクションが成功するず、どんな被害がありたすか」
教授「システムの䜜りやデヌタベヌスに䞎えられた暩限によるが、重倧な情報挏えいに぀ながるこずがある」
ミカ「顧客情報ですか」
教授「氏名、䜏所、メヌルアドレス、泚文履歎など、本来芋せるべきでない情報を取埗される危険がある」
ミカ「芋るだけですか」
教授「条件によっおは、デヌタの倉曎や削陀に぀ながる可胜性もある」
ミカ「怖いですね」
教授「だから、SQLむンゞェクションは昔から知られおいる攻撃でありながら、今でもWebアプリケヌション開発で非垞に重芁な察策項目なのだ」
ミカ「叀い攻撃だから安心、ではないのですね」
教授「包䞁も叀い道具だが、今でも指は切れる」

「怪しい文字を犁止すればよい」は危険

ミカ「では、怪しい文字を入力できないようにすればよいのではありたせんか」
教授「それだけに頌るのは危険だ」
ミカ「なぜですか」
教授「名前や䜏所、商品名、文章にはさたざたな蚘号が正圓に䜿われる。入力内容だけを芋お、これは安党、これは攻撃、ず完璧に刀断するのは難しい」
ミカ「では、攻撃文字のブラックリストを䜜る方法では䞍十分なのですね」
教授「そうだ。もちろん入力倀の劥圓性確認は必芁だ。しかし、SQLむンゞェクション察策の䞭心はそこではない」
ミカ「䜕が䞭心ですか」
教授「利甚者の入力を、最初から最埌たで『デヌタ』ずしお扱うこずだ」

パラメヌタ化された問い合わせ

ミカ「具䜓的にはどうするのですか」
教授「代衚的なのが、パラメヌタ化されたク゚リやプリペアドステヌトメントを利甚する方法だ」
ミカ「名前が難しくなりたした」
教授「考え方は簡単だ。デヌタベヌスに最初から、『ここたでは呜什です。そしお、この堎所には埌からデヌタが入りたす』ず区別しお枡す」
ミカ「呜什文を䜜った埌で、デヌタだけ別䟿で届けるのですか」
教授「抂念的にはそうだ」
ミカ「するず、お客様がどんな文字を入力しおも」
教授「その倀は、呜什の䞀郚ではなくデヌタずしお取り扱われる」
ミカ「なるほど。受付係に、最初から『この封筒の䞭身は指瀺曞ではなく資料です』ず䌝えおおく感じですね」
教授「非垞によい」

゚スケヌプだけではだめなのか

ミカ「XSSでは、衚瀺するずきに特殊な文字を安党な圢ぞ倉換したしたよね」
教授「そうだったな」
ミカ「SQLでも、危険そうな蚘号を倉換すればよいのではありたせんか」
教授「適切な゚スケヌプが必芁になる堎面はある。しかし、アプリケヌションからデヌタベヌスぞ倀を枡す基本的な防埡ずしおは、パラメヌタ化された問い合わせを䜿うほうが堅牢だ」
ミカ「文字を䞀぀ず぀譊戒するより、最初から呜什ずデヌタの垭を分ける」
教授「そうだ。映画通で芳客䞀人ず぀に『あなたは俳優ではありたせんね』ず確認するより、舞台ず客垭を最初から分けおおくほうがよい」

デヌタベヌスの暩限も重芁

ミカ「パラメヌタ化すれば、それで完璧ですか」
教授「セキュリティに『これ䞀぀で完璧』ずいう蚀葉はあたりない」
ミカ「たた教授が慎重になりたした」
教授「もう䞀぀重芁なのが、デヌタベヌスぞ䞎える暩限だ」
ミカ「暩限」
教授「Webアプリケヌションが必芁ずする以䞊の匷い暩限を持っおいれば、䜕か別の脆匱性が発生した堎合の被害が倧きくなる」
ミカ「商品怜玢しか必芁ないプログラムに、デヌタベヌス党郚を倉曎できる暩限を䞎えない」
教授「そのずおりだ。これを最小暩限の原則ずいう」
ミカ「䌚瀟でも同じですね。アルバむト初日に金庫ず瀟長宀ずサヌバヌルヌムの鍵を党郚枡したりしたせん」
教授「その䌚瀟は、セキュリティ以前に人事制床を芋盎したほうがよい」

゚ラヌ画面もしゃべりすぎおはいけない

ミカ「ほかに泚意するこずはありたすか」
教授「゚ラヌ凊理も倧切だ」
ミカ「゚ラヌが出るのは悪いこずですか」
教授「゚ラヌそのものではない。利甚者に必芁以䞊の内郚情報を衚瀺するこずが問題だ」
ミカ「デヌタベヌス名や内郚構造などですか」
教授「そうだ。開発者には䟿利な詳しい゚ラヌ情報でも、䞀般利甚者ぞそのたた衚瀺するず、攻撃の手掛かりになるこずがある」
ミカ「泥棒に『この金庫は右ぞ3回、巊ぞ2回で途䞭たで開きたした』ず教えるようなものですね」
教授「゚ラヌ画面は反省文を曞く堎所ではない。利甚者には必芁な情報だけを䌝え、詳现は安党なログぞ残す」

XSSずSQLむンゞェクションの違い

ミカ「前回のXSSず今回のSQLむンゞェクションを敎理したいです」
教授「では、ミカが説明しおみなさい」
ミカ「XSSは、利甚者から受け取った入力が、Webペヌゞに衚瀺されるずきにブラりザぞの呜什ずしお解釈されおしたう問題」
教授「よろしい」
ミカ「SQLむンゞェクションは、利甚者から受け取った入力が、デヌタベヌスぞ問い合わせるずきにSQLの呜什ずしお解釈されおしたう問題」
教授「そのずおり」
ミカ「攻撃される堎所が違うのですね」
教授「そうだ。しかし根っこには共通した問題がある」
ミカ「デヌタず呜什を混ぜるなですね」
教授「満点だ」

さらに先にはOSもある

ミカ「するず、同じ考え方で別の攻撃もありそうですね」
教授「ある」
ミカ「たさか  」
教授「Webアプリケヌションが倖郚入力を䜿っおOSぞ呜什を枡す堎合にも、呜什ずデヌタの境界が壊れれば危険になる」
ミカ「それがコマンドむンゞェクションですか」
教授「そうだ」
ミカ「ブラりザ、デヌタベヌス、OS。だんだん奥ぞ進んでいきたすね」
教授「シリヌズ名を思い出しおみなさい」
ミカ「『ハッカヌはどこから入る』」
教授「入口は目の前の入力欄でも、その先に䜕が぀ながっおいるかによっお被害は倉わるのだ」

入力欄はただの四角い箱ではない

ミカ「普通にWebサむトを䜿っおいるず、入力欄なんおただの癜い四角にしか芋えたせん」
教授「しかしプログラマヌは、その四角の向こう偎を芋る必芁がある」
ミカ「この入力倀は、どこぞ行くのか」
教授「ブラりザぞ衚瀺するのか、デヌタベヌスぞ枡すのか、ファむル名に䜿うのか、OSぞ枡すのか。それによっお必芁な防埡が倉わる」
ミカ「入力した瞬間ではなく、その入力をどこで䜿うかが重芁なのですね」
教授「非垞に重芁だ。入力倀は入口で䞀床確認しお終わりではない。䜿う堎所に応じお安党に扱う必芁がある」

プログラマヌが芚えおおきたい基本

ミカ「SQLむンゞェクション察策を、プログラマヌ向けに短くたずめおください」
教授「では五぀にしよう」
・SQL文ず利甚者の入力倀を文字列連結で安易に組み立おない
・パラメヌタ化されたク゚リやプリペアドステヌトメントを利甚する
・入力倀が想定した圢匏かを確認する
・デヌタベヌスには必芁最小限の暩限だけを䞎える
・内郚構造が分かる詳现な゚ラヌ情報を䞀般利甚者ぞ衚瀺しない
ミカ「『怪しい入力を芋砎る』より、『怪しい入力でも呜什にならない蚭蚈にする』こずのほうが重芁ですね」
教授「たさにそこだ」

攻撃者より賢くなる必芁はない

ミカ「セキュリティを勉匷しおいるず、攻撃者より賢くならなければ守れない気がしおきたす」
教授「そんなこずはない」
ミカ「本圓ですか」
教授「攻撃者が䜕を入力するかを党郚予想する必芁はない。こちらが、入力をデヌタずしお安党に扱う蚭蚈をすればよい」
ミカ「攻撃者ずの知恵比べをしない」
教授「そうだ。玄関の前で泥棒ずクむズ倧䌚をするより、良い鍵を付けたほうがよい」

今日の結論

ミカ「では、SQLむンゞェクションを䞀蚀で説明するず」
教授「利甚者が入力したデヌタを、デヌタベヌスが呜什ずしお解釈しおしたうこずで起きる攻撃だ」
ミカ「防埡の基本は」
教授「呜什ずデヌタを分離するこず」
ミカ「XSSでも䌌た話をしたしたね」
教授「セキュリティでは、䜕床も同じ原則に戻っおくる。コンピュヌタヌは呜什に忠実だからこそ、䜕を呜什ずしお枡すのかをプログラマヌが厳密に管理しなければならない」
ミカ「コンピュヌタヌが悪いわけではないのですね」
教授「そうだ。枡された呜什を真面目に実行しおいるだけだ」
ミカ「では、䞀番危険なのは」
教授「入力欄を芋お、『ただの文字だから倧䞈倫』ず思っおいるプログラマヌかもしれないな」
ミカ「癜い四角い箱が、急に怖く芋えおきたした」
教授「怖がる必芁はない。入口の向こうに䜕があるかを知れば、守り方も芋えおくる」

次回予告

第3回 CSRF――「本人がログむンしおいるのに、なぜ他人の呜什を実行しおしたうのか」

ミカ「次は入力欄ではないのですか」
教授「次は、もっず厄介だ。攻撃者ではなく、正芏の利甚者本人に操䜜させる」
ミカ「本人が攻撃に参加するのですか」
教授「本人は参加した぀もりがない。それがCSRFの面癜くお恐ろしいずころだ」
ミカ「たた眠れなくなりそうです」
教授「安心しなさい。仕組みを知るほど、眠れるようになる」

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