[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

徳丸浩の日記


2010年10月03日 「PHPで作成する携帯会員サイトの基本」の諸問題(1)

_問題点の概要

CodeZineから発表されている「PHPで作成する携帯会員サイトの基本」という記事はツッコミどころ満載で、既にいくつかの問題が修正されているのだが、まだ残っている問題があることや、修正内容にも疑問があるので、いくつか指摘してみたい。ざっと書いたところ、ものすごく長くなりそうだったので、小出しで「連載」の形で書く。忙しいので途中でやめるかもしれない。今回は、問題点の概要を報告する。

くだんの記事をざっと見たところ、以下の問題を見つけた。

IPアドレス制限のない「かんたんログイン」

Net_UserAgent_Mobileを用いて携帯電話の端末IDを取り出し、かんたんログインを実装しているが、ゲートウェイのIPアドレス経由であることを確認していない。以下のリストは、端末IDを取り出しているところ(4ページ目)。

$agent = Net_UserAgent_Mobile::singleton();
$uid = $agent->getUID();

かんたんログインは、IPアドレスチェックをしても安全とはいえないが、IPアドレスチェックをしていないのは論外といえる。

参考→「高木浩光@自宅の日記 - はてなのかんたんログインがオッピロゲだった件

クロスサイト・スクリプティング(XSS)

プロフィール画面にて、氏名の表示箇所にクロスサイト・スクリプティング脆弱性がある(4ページ目)。以下のリストが該当の表示部分だが、登録・更新の画面でも文字種などはチェックされていない。加えて、データベースには、どの項目も255文字までの登録が可能なので、攻撃には十分な文字数である。

<?php $userInfo = $ss->getSession(); ?>
ようこそ、<?php echo $userInfo['user_name']; ?>さん    <br /> 

このページはユーザプロファイルの表示画面だから、本来は、自分自身のユーザ情報のみが表示される。この制約下で、どこまでXSS攻撃が可能かどうかを考えることは、脆弱性のリスクを分析するトレーニングとして好適だろう。ヒントとしては、このサンプルスクリプトは、URLにセッションIDを埋め込んでいることと、かんたんログインをサポートしていることである。

無意味なセッションIDの再生成

ページ生成毎にHTTP_Session2::regenerateId(true);を呼び出している。すなわち、ワンタイムのセッションIDを採用している。脆弱性ではないが、以下の欠点があり、使い物にならないだろう。

  • ブラウザ機能による「戻る」操作ができない
  • リロードするとセッションが切れる(ログアウト状態になる)
  • 電波状態などの理由で一度でも通信が途切れるとセッションが切れる

最初の稿では、regenerateId()の引数trueが省略されていたので、上記欠点がない代わりに、セキュリティ上はなんの効果もなく、逆にログアウト処理ができないという副作用があった。

MySQLの設定によってはSQLインジェクション脆弱性

最初の稿では、Shift_JIS文字エンコーディングでPDOを使っているため、SQLインジェクション脆弱性があった(参考→「ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション) 」)。現在は改修されているが、それでもPHPの内部文字エンコーディングをShift_JISにしている点はそのままで、好ましくない。

元パスワードを確認しないパスワード変更機能

これは見出しの通り

パスワードの保存方法

元々は平文でパスワードを保存していたが、その後改修され、MD5ハッシュの形で保存されている。要件によってはパスワードの平文保存が絶対ダメとまでは思わないが、仮にハッシュで保存するのであれば、saltなしのMD5ハッシュでは意味がない。これについては後日詳しく書く予定。

まとめ

PHPで作成する携帯会員サイトの基本 」という記事について、主にセキュリティ上の問題点の概要を説明した。現在は改修されているものもあるが、SQLインジェクションあり、XSSあり、IPアドレス制限すらないオッピロゲのかんたんログインありで、脆弱性のオンパレードだ。SQLインジェクションは改修されたが、他の脆弱性は現時点で改修されていないようだ。読者は、絶対に参考にしてはならないし、ましてやコピペして本番サイト開発に利用してはならない。もっとも、regenerateId(true)の副作用が強すぎて、仮にコピペしても使いものにならないと思われる。

本日のツッコミ(全5件) [ツッコミを入れる]
_ 鈴木 (2010年10月03日 22:42)

> regenerateId(true)の副作用が強すぎて、仮にコピペしても使いものにならないと思われる。

残念ながらそのような「使い物にならない」サイトは普通に存在すので、この問題が制約になるとは期待できないのではないでしょうか

_ roo (2010年12月02日 19:02)

> 仮にハッシュで保存するのであれば、saltなしのMD5ハッシュでは意味がない。これについては後日詳しく書く予定。

お忙しいとは思いますが、もし可能であれば上記の件のエントリーを期待しています。

_ 徳丸浩 (2010年12月04日 10:23)

rooさん、コメントありがとうございます。
そうですね、僕も書きたいと思っているのですが、ちょっと時間がとれません。
この問題については、時々twitterで@haruyamaさんと会話しているので参考になさってください。また、@haruyamaさんの第1回神泉セキュリティ勉強会での講演資料が参考になります。
http://www.unixuser.org/~haruyama/security/SinSec20101026/presentation/
私も今書いている本で、このテーマはたっぷりと書いていますが、出版されるのは来年になりそうで、もうしばらくお待ちください

_ roo (2010年12月06日 14:55)

お返事ありがとうございます。
講演資料、大変参考になりました。
saltなしハッシュの危険性がわかりました。
そういえば、md5ハッシュをデータベース化して、復号化をサポート?してるサイトがありますね。

_ (^_^.) (2012年07月03日 14:18)

分かりやすかったです。
情報の授業に役立ちました☆
(あ、コピーなどはしていないのでご安心くださいませ。)



[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

ockeghem(徳丸浩)の日記はこちら
HASHコンサルティング株式会社

最近の記事

最近のツッコミ

  1. (^_^.) (07-03)
  2. roo (12-06)
  3. 徳丸浩 (12-04)
Google