そして週明け……
クウ 「おはよー」
ユウヤ 「おはよ。勉強会はどうだった?」
クウ 「なんか宿題が出たよー!」
ユウヤ 「ああ、なんかWebにも上がってたね」
クウ 「おおっ? そんなところチェックしてるんだ」
ユウヤ 「まあね。いろいろ知っておかないといけないし。それより、宿題解けたんか?」
クウ 「いや……。さっぱり……。難しいよね、あれ」
ユウヤ 「いや、簡単だったぞ?」
クウ 「ええっ! もう解けたの??」
ユウヤ 「……まあ、頑張って解いてくれ」
クウ 「むむむ……」
【関連記事】 基礎のキソ、エブリバディ・セッション管理! http://www.atmarkit.co.jp/fsecurity/rensai/httpbasic07/httpbasic01.html |
クウ 「やっぱり分からないー。答え教えてー」
ユウヤ 「しょうがないなぁ」
クウ 「教えてください><」
ユウヤ 「これは、典型的な脆弱なセッションIDだね。まず並べ替えてみるとよく分かる。まず、先頭の文字で並べ替えてみる」
クウ 「並べ替えて意味あるの?」
c. 23317998991 g. 23317998031 b. 34428009092 j. 34428009172 d. 45539110123 i. 45539110273 e. 56640221344 h. 78862443596 f. 89973554687 a. 90084665648
ユウヤ 「もう、これだけで攻略された、っていっていいくらいなレベルだが、例えば、『c』と『g』を比べてみよう。9、10文字目以外全部同じだ」
クウ 「ホントだ……。『b』と『j』とかもほとんど同じ……」
ユウヤ 「次に、先頭の数字が近い『b』と『c』について比べると、これまたとても似ている」
クウ 「どこが……?」
ユウヤ 「鈍いな……。『c』の各けたに1足したらほとんど同じだ」
c'. 34428009002 b. 34428009092
クウ 「ホントだ……」
ユウヤ 「さらに、同じようにして、全部、先頭が『1』になる値を各けたに足す」
クウ 「ふむ……」
a. 12206887860 b. 12206887870 c. 12206887880 d. 12206887890 e. 12206887900 f. 12206887910 g. 12206887920 h. 12206887940 i. 12206887940 j. 12206887950
ユウヤ 「さすがにこれで、ほぼ連番っぽくなっているのは分かるよな?」
クウ 「おおっ! ホントだ! すごーい!」
ユウヤ 「さらに、これが、最後のけたを除いたら時間、つまり1970年1月1日00:00:00 UTCからの経過秒数だって分かれば完ぺきだな」
クウ 「ふむふむ」
ユウヤ 「脆弱なセッションIDで、『時間』をキーにして単純な変換をするだけというのは簡単に思いつくから結構やってしまいがちだな。だから、見る人が見れば、時間さえ分かればセッションIDが作れてしまうってのは簡単に分かるよ。逆に、この問題がいつ作られたかも丸分かりだね」
クウ 「なるほど……」
ユウヤ 「むしろ、普通は、時間をキーにして作られていないか? から疑ってかかるくらいだけどね」
クウ 「ユウちゃん、よく知ってるね。そんなのどこで習ってくるの?」
ユウヤ 「まあ、常識だな」
クウ 「くぅ……」
セッションIDのようにランダム性が必要となる値を生成する際には、時刻のように簡単に分かってしまう値をキーにしたり、簡単な変換ルールに頼ってしまったりしないようにする必要がある。また、時刻のように一意にならない可能性のあるものをキーにした場合、異なるユーザーで同じセッションIDを利用してしまう可能性があるため、注意が必要である。
【クウたちの壁紙カレンダー、配布中!】
本連載のイラストを担当しているはるぷさんによる、毎月更新のカレンダーが配布されています。ぜひご利用ください!
特製ウォールペーパー
http://www.ubsecure.jp/wallpaper.php
(Illustrated by はるぷ)
株式会社ユービーセキュア 技術本部 VEXグループ リーダー 兼 セキュリティオーディットコンサルタント
杉山 俊春(すぎやま としはる)
セキュリティコンサルタントとして、主にWebアプリケーションのセキュリティ検査やWebアプリケーション検査ツールの開発などに従事している。大手ショッピングサイトなどの検査実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.