[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)の副作用が強すぎて、仮にコピペしても使いものにならないと思われる。
- http://www.tokumaru.org/ ×347
- https://www.google.co.jp/ ×109
- http://matome.naver.jp/odai/2130703341843559101 ×39
- http://mnews.atode.cc/ ×35
- http://matome.naver.jp/m/odai/2130703341843559101 ×8
- http://4ki4.cocolog-nifty.com/blog/2008/01/3_f517.... ×4
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×2
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×2
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×2
- http://ameblo.jp/suminoekutintai/ ×2
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.com/ ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- http://www1.tokumaru.org/d/20110830.html ×1
- http://www1.tokumaru.org/d/20110329.html ×1
- http://sitereview.bluecoat.com/sitereview.jsp ×1
- http://search.fenrir-inc.com/?q=php 問題点&hl=ja&safe... ×1
- http://search.fenrir-inc.com/?lr=all&q=携帯サイト リロード&... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://ru-driver.ru/ ×1
- http://osaka-nebiki.com/ ×1
- http://news.atode.cc/ ×1
- http://friendfeed.com/themoblab1/75223cd5/php-1 ×1
- ログインパスワードがないPHPの問題点 ×2 / fuelphp ガラケー端末id ×1 / php 会員サイト作成 ×1 / 携帯 会員サイト 作成 ×1
[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
HASHコンサルティング株式会社
最近の記事
- 2011年08月30日
- 1. RSSフィードをリダイレクトします
- 2011年07月01日
- 1.
- 2011年03月29日
- 1. PDO/MySQL(Windows版)の文字エンコーディング指定の不具合原因
- 2011年03月22日
- 1. PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
- 2011年01月27日
- 1. CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
- 2011年01月04日
- 1. escapeshellcmdの危険な実例
- 2011年01月01日
- 1. PHPのescapeshellcmdの危険性
- 2010年10月03日
- 1. 問題点の概要
- 2010年09月27日
- 1. 文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定
- 2010年07月25日
- 1. ツッコミSPAM対策で、ツッコミ抜きのRSSフィードを用意しました
- 2010年07月01日
- 1. ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
- 2010年04月06日
- 1. PROXY(プロキシ)経由でのDNSリバインディングと対策
- 2010年04月05日
- 1. JavaアプレットのDNSリバインディングはJRE側で対策済みだった
- 2010年03月29日
- 1. DNSリバインディングによる無線LANパスフレーズの読み出しに成功
- 2010年03月25日
- 1. DNSリバインディングによるルータへの侵入実験
- 2010年02月22日
- 1. ケータイtwitter(twtr.jp)においてDNS Rebinding攻撃に対する脆弱性を発見・通報し、即座に修正された
- 2010年02月12日
- 1. かんたんログイン手法の脆弱性に対する責任は誰にあるのか
- 2010年01月18日
- 1. iモードブラウザ2.0のXMLHttpRequestでPOSTデータの扱いが困難になった
- 2009年10月19日
- 1. quoteメソッドの数値データ対応を検証する
- 2009年10月14日
- 1. htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない
- 2009年10月09日
- 1. htmlspecialcharsのShift_JISチェック漏れによるXSS回避策
- 2009年09月30日
- 1. htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
- 2009年09月24日
- 1. SQLの暗黙の型変換はワナがいっぱい
- 2009年09月18日
- 1. 文字エンコーディングバリデーションは自動化が望ましい
- 2009年09月14日
- 1. 既にあたり前になりつつある文字エンコーディングバリデーション
- 2009年08月05日
- 1. 携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性
- 2009年03月28日
- 1. IPAは脆弱性の呼び方を統一して欲しい
- 2009年03月27日
- 2009年03月11日
- 1. U+00A5を用いたXSSの可能性
- 2008年12月22日
- 1. JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性
> regenerateId(true)の副作用が強すぎて、仮にコピペしても使いものにならないと思われる。
残念ながらそのような「使い物にならない」サイトは普通に存在すので、この問題が制約になるとは期待できないのではないでしょうか
> 仮にハッシュで保存するのであれば、saltなしのMD5ハッシュでは意味がない。これについては後日詳しく書く予定。
お忙しいとは思いますが、もし可能であれば上記の件のエントリーを期待しています。
rooさん、コメントありがとうございます。
そうですね、僕も書きたいと思っているのですが、ちょっと時間がとれません。
この問題については、時々twitterで@haruyamaさんと会話しているので参考になさってください。また、@haruyamaさんの第1回神泉セキュリティ勉強会での講演資料が参考になります。
http://www.unixuser.org/~haruyama/security/SinSec20101026/presentation/
私も今書いている本で、このテーマはたっぷりと書いていますが、出版されるのは来年になりそうで、もうしばらくお待ちください
お返事ありがとうございます。
講演資料、大変参考になりました。
saltなしハッシュの危険性がわかりました。
そういえば、md5ハッシュをデータベース化して、復号化をサポート?してるサイトがありますね。
分かりやすかったです。
情報の授業に役立ちました☆
(あ、コピーなどはしていないのでご安心くださいませ。)