システムエンジニアを職業とする管理人のIT関連資格試験体験記です。現在はテクニカルエンジニア(情報セキュリティ)挑戦中です。
« 2006年09月 | メイン | 2006年11月 »
2006年10月のアーカイブ
Categories
Archives
メールマガジン
【情報セキュリティ】SQLインジェクション
セキュアドの午後2で、SQLインジェクションに関する問題が出題されていたので、少しまとめておこうかと思います。
SQLインジェクション(SQL-Injection)は、直訳すると「SQLの挿入」という意味になります。
簡単に説明すると、WEBで入力した値を元にSQLを組み立てるようなプログラムがあったとします。
極端なプログラムをC#で書くとすると、
string sqltext = "SELECT * FROM USER_TABLE WHERE USER_ID = '" + User.Text + "' AND PASSWARD = '" + Password.Text + "'";
そこで、入力用のテキストボックスに
User.Text ← "Hoge"
Password.Text ← "' OR '1'='1"
と入れると、生成されるSQLは以下のようになりますね。
SELECT * FROM USER_TABLE WHERE USER_ID = 'Hoge' AND PASSWARD = '' OR '1'='1'"
プログラムで1件だけ取得することを前提としている場合には、先頭のレコードのユーザでログインすることになります。
もしも先頭レコードが管理者権限だったら(最初に管理者を登録するシステムは多いと思うので、可能性は高い)、たったこれだけの手法で管理者権限が奪われることになります。
この攻撃は上記のとおり、非常に簡単な手法なのですが、実際に対策を実施しているサイトは少ないとされています。
セキュアドの午後2では、この問題が発覚する前に「エラー画面にSQL文が表示された」という兆候が現れていました。(まあ試験なので)
プログラマの視点からすると、デバッグ時の効率を考えSQL文を表示したのでしょうが、これは極めて危険な考え方です。
なぜなら、攻撃者に攻撃するためのヒントを教えるようなものだからです。
(多少の知識があれば、表示されている内容からデータベース構造の予想がつきます)
テーブルが分かっている場合、
Password.Text ← "';DELETE FROM USER_TABLE WHERE '1'='1
と入力すると、ユーザを全削除することも可能になってしまいます。
デバッグ時に表示するのはいいとしても、リリースバージョンでは表示しないように設定すべきでしょう。
ログファイルに出力している場合、そのログファイルは外部からアクセスできないようにしておく必要があります。
さて、実際のプログラムでの対策方法ですが、大きく分けて2つの手法があります。
・SQL制御用のタグをサニタイズする
・パラメータクエリを使用する
[SQL制御用のタグをサニタイズ]については、クロスサイトスクリプティング対策と似た考え方ですが、「'」を「''」のように二重化することでデータベースサーバ側で文字列として認識してくれるようになります。('だけでなく、他の文字列もサニタイズが必要ですが、データベースによって方法が多少異なります。)
[パラメータクエリを使用]は、最良の方法だと思いますが、IN句が表現できないなどの問題も存在します。
IN句の取り扱いについては、サニタイズの手法と組み合わせるか、テーブル形式のXMLをパラメータにセットできるデータベースであれば結合演算させることで同じ結果を求めることが可能です。
パラメータクエリの利点として、セキュリティ以外にも速度が速くなるなどの効果が得られる場合もあります。
いずれにしても、プログラマは知っておく必要があり、事故が起こってから知らなかったでは済まない事態になることも少なくありません。
テストを行う際にも、この点を押さえた攻撃テストを行う必要があります。
サイト名について
当サイトの「セキュアド受験日記」ですが、当面はこのままとしておきます。
合格発表の後、「テクニカルエンジニア受験日記(仮)」などに変更する予定です。
タイトルを変更しても、内容はそのまま残しておきます。
春期試験に向けて
秋期試験が終わったばかりですが、次のターゲットを考えようと思います。
春期で行われる試験区分のうち、過去に受験歴があるのは
・テクニカルエンジニア(データベース)
・テクニカルエンジニア(情報セキュリティ)
なのですが、今回セキュアドを受けた延長上ということで、テクニカルエンジニア(情報セキュリティ)を受験しようと思います。
性格的に負けっぱなしが嫌なので、情報セキュリティ合格の暁にはデータベースも狙いにいきます。
(ってことは、あと2年勉強が続くのかあ....orz)
さて、テクニカルエンジニア(情報セキュリティ)ですが。
今年の春に新設されたばかりなのでイマイチ傾向がつかめないのが厄介といえるのではないでしょうか。
今年の敗因として考えられるのは、
・ITEC、TACの参考書が予想している範囲がかなり違っていた(新設だから仕方ないだろうけど)
・プログラムの問題が多少はあると思っていたが、Perlの文法を知らないとどうにもならない内容だった
と考えています。
特にPerlについては、採点結果の点数を見る限りPerlの問題以外はほとんど正解していたようなので、この問題を選ばなかったらと思うと後悔しています。
これを踏まえ、来年の対策を
・Perlの問題は捨てる(選択問題なので絶対に選ばない)
・ITEC、TACの参考書も使うが、試験の参考書以外のセキュリティに関する書籍も導入する
としたいと思います。
セキュアド午前採点結果
正午に解答がアップされています。
早速採点してみると、48/55(87%)の正解率でした。
2択まで絞りこんだものの、最後は勘に頼った問題は全部外れていました(泣)
次回からは、違うなと思う方をマークするようにしようっと(爆)
試験当日
今日は秋期の情報処理技術者試験でした。
やれることはやりつくした感じだったので後悔もなく、いよいよという気分です。
勉強疲れも今日はすっかり取れていて、さわやかな目覚めでした。
試験会場は東京電機大学でした。
過去に受けたときも東京電機大学でしたが、あのときはニコライ堂という教会が側にあり、やたらと鐘がうるさくて集中できなかったことを少し思い出したり。
午前の問題はかなり簡単でした。
というか、昨日の夜に少しだけ復習したところが出まくり状態!!
あいかわらず過去問題の使いまわしなので、しっかり復習しておけば落ちることは無さそうですね。
午前の試験を退出許可時間になるとともに終了し、午後に備えて体力温存を図ります。
食事は摂りすぎると眠くなるので軽めに食べて、5分ほどウオーキング。
午前試験の終了後に教室に戻り、睡眠を取りました。
額には冷えピタを貼ってクールダウンし、携帯用の空気枕を使って本格的に休みました。
この試験は実に長丁場で、トータル5時間ほど掛かります。
人間の集中力はそれほど長く続くわけではないので、最大の山場となる午後1をどんな状態で受けれるかは大事なことだと思います。
以前は午後試験の前に参考書を読んだりしていたのですが、実際に試験前に読んだところが出たこともなく、また落ち着かないのか全く覚えられなかったりします。
特に高度区分の試験は頭を使わされるので、いまさら暗記しても無駄ともいえるでしょう。
要するに、前日までにしっかり対策を行っておけば当日に慌てる必要もない訳です。
十分な対策をしておくという考え方は、セキュリティ対策の考え方とも同じですし。
と、ゆっくり休んだものの、やはり1時間半で3問はきついですね。
問題を読むだけで10分掛かっちゃいますし、問題選択で5分使ったのも痛かったです。
なんとか全問回答が終わったとき、残り時間はあと1分でした(汗)
午後2も時間半ですが、こちらは1問選択なので時間の余裕があります。
内容は少し難しくなっていますが、じっくり考えることにします。
問題を見てみると...なんかSQLインジェクションとか出てきてるんですが...
これってアドミニストレータ向きというより、テクニカルエンジニア(情報セキュリティ)向きの問題ですよね。
午後1の問題3もサブネットマスクの計算とか出てたけど、今年はこのあたりで苦戦した人もいるかもしれません。
私は本業がアーキテクチャ部分のエンジニアなので、得意分野だったりします。
セキュアドは得意分野が生かせないと思ってたので、まさかのサプライズでした。
ということで、なんとか無事終了。
今回の出来は今まで受け続けた試験の中で一番手ごたえがあったように思えました。
ただ、セキュアドは一般論を答える問題も多く、趣旨と違うことを解答しちゃった可能性もありますが。
まあ精一杯やれたので、果報は寝て待つことにします。
試験前日
いよいよ明日は秋期の情報処理試験です。
1ヶ月間、午後対策を行ってきたので、あとは当日どんな問題が出てくるかに賭けることにします。
最後の1日でやること。
・専門用語の漢字を復習すること
・午前問題の過去問題を復習すること
午前の問題はこの本がとても良いです。
分野別に纏まっているので、苦手な分野を集中して勉強できます。
私がなぜ前日にこの復習をするかというと、過去問題がそのまま出題されることが多いからです。
つまり、意味が分からなくても正しい選択肢を覚えてしまえばそれでOKなのです。
なので、前日に苦手分野の問題と正しい選択肢を丸覚えしているのです。
ポイントは、いきなり正解を見て、正しい選択肢のみを読んで覚えること。
他の選択肢はできるだけ見ないようにすることです。
そうすることで正解の選択肢をより覚えることができます。
午前が苦手な人は是非やってみてください。
試験の方針が変わって、過去問題が一切出なくなるということがない限り、かなり有効的な方法ですよ。
娘の理解
最近、娘が勉強の邪魔をしなくなってきた。
相変わらず部屋にやっては来るものの、「あ、お父さん勉強してるねえ~」などと言い、邪魔しないように去っていきます。
リビングの方からは、「お父さん、お勉強頑張ってるねえ」などと言っている声も聞こえる。素直に嬉しい。
元々、資格や試験はかなりの数を受けていて、実際に受かったりしている訳だけど、ここ数年は気合の入り方がちょっと違います。
自分でも驚いていることなのだけれど、娘のために頑張っている自分がいます。
今までは自分のスキルのため、仕事の受注に繋げるため(個人事業だから)と、どちらかと言うと自分のためだった訳ですが、最近は娘に頑張っている父の姿を見てもらいたいという気持ちがあります。
私は父に捨てられた子なので、父の存在を自慢には思えません。
だからこそ、娘には父の存在が自慢であってほしいと願うのです。
娘はまだ2歳になったばかりだけど、だんだんといろいろ分かってきたようです。
もっともっと頑張らないとなあ~♪
午後対策のまとめ
試験もあと少し。
午後対策も、そろそろまとめないといけません。
ということで、この3日間で過去3年分の午後1を再チャレンジしています。
結果は、一度やっている問題とはいえ、8~9割ほどの正解率になりました。
繰り返し問題を解くことで、正しい考え方を刷り込むというのが目的なんですが、なんとか達成できたと思います。
車に乗りたい娘
午後2対策も順調に進んで、今日は平成15年度問題を復習しました。
だんだん様々な基準も理解してきて、専門用語も答えられるようになってきました。
セキュアド対策は過去問題、それと各基準を理解することですね。
各基準は買うと高いので、まとめてあるサイトをインターネットで探すのがいいかもしれません。
娘は予想ほど邪魔しないようで、「どうやらお父さんの勉強というものは邪魔してはいけないものらしい」ということを理解してきた模様。
しかし、まだ2歳になったばかりの娘には、頭では分かっているものの、なかなか行動で示すのは難しいようでもあります。
そこで、今日はご褒美にちょっとだけドライブすることに。
「車乗る?」と聞いたら、「乗る!!」と上機嫌になる娘。たまには遊んであげないとね。
娘が「セブン行くの~♪」と言っている。
セブンというのは、多分イトーヨーカドー(7iの看板があるため)の事だろう。
イトーヨーカドーに行く途中にはセブンイレブンがたくさんあり(浦安はセブンイレブンが多い)、その前を通る度に「セブン見つけた~♪」などと言っている。
3連休
3連休、その甘美な響きは、私だけ別な意味になっているのかもしれません。
「3日も連続で試験勉強できるじゃないか!!」
ということで、3連休は徹底的にやってやろうと思います。
ターゲットは過去3年間の午後2を攻略することです。
今日は初日ということで、図書館に行くことにしました。
浦安市中央図書館は家から自転車で10分くらいの近場にあるのですが、本をアマゾンで注文しまくっている私は意外と利用していないのです。
図書館に行こうと思ったのは娘が邪魔するからなんですが、どんな本があるのかにも興味があったりします。
図書館の勉強部屋は図書カードが無いと利用できず、図書カードもそれを作るための身分証明書も持ち合わせていなかった私は、結局利用できずにソファに座って問題集を読むだけでした。
うーむ残念。
しかし、この浦安市中央図書館、すごく広いです。驚きました。
以前住んでいた八千代市の図書館と比較すると、表現できないほどの違いがあります。
その幅広い蔵書の数だけでなく、インターネットコーナーや喫茶コーナーまであって、長時間居たくなるような心地よさです。
図書館の隣には郷土博物館もあるので、こんどは娘と来ようかなと思ってみたり。