| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2008-08-18 PHP
●PHP:session_set_save_handlerリファレンスマニュアルのサンプルにパス・トラバーサル脆弱性
PHPのsession_set_save_handlerのリファレンスを眺めていて、ふと、これはパス・トラバーサルの脆弱性があるのではないかと思いました。
function read($id)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id"; // ← ファイル名の組み立て
return (string) @file_get_contents($sess_file);
}
function write($id, $sess_data)
{
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id"; // ← ファイル名の組み立て
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
...
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
...
ここで、readはセッションデータを読み出す関数、writeはセッション値を保存する関数で、session_set_save_handlerでセットしておくものです。コメントで「ファイル名の組み立て」と示している部分でファイル名をセットしていますが、変数$idの値(セッションID)の値が未検証のまま使われています。
問題は、PHP処理系にてセッションIDの値がどの程度チェックされるかです。よく知られているように、PHPにはSession Adoptionの問題があり、素のままの状態では外部からCookie PHPSESSIDにより指定されたセッションIDをそのまま受け入れます。私が色々な文字で試した範囲では、「<」、「>」、「'」、「"」に関してはチェックが行われており、これらの文字がPHPSESSIDに含まれていた場合には、セッションIDの再設定が行われました。一方、それ以外の文字、とくに「/」、「.」、「\」などは特にチェックされないまま素通ししてしまうので、パストラバーサルの脆弱性となります。
このサンプルを流用しているようなケース、あるいは類似の処理を行っている場合(session_set_save_handlerにて、ファイルによるセッションデータ保存を行っている場合)には、この問題の影響を受けます。
この問題の影響範囲ですが、情報漏えいの可能性は低いと考えられます。パス・トラバーサルの技法で任意のファイル名を指定することは可能ですが、たまたまPHPのセッション保存形式と適合する形式のファイルでなければ、読み出しは行われないからです。そのようなファイルがたまたまWebサーバー上に存在し、かつそのファイル名が類推できる場合に限られますが、そのようなケースは想定しにくいと考えます。
一方、ファイルの破壊(書き込み)については、権限さえあれば任意のファイルを指定して破壊できるので、ある程度の影響が考えられます。UNIX系のOS上でPHP(Apache)を実行するユーザの権限で書き込みが可能なファイルは一般的には限定されますが、権限設定がゆるい場合には影響を受けます。Windows上でPHPが稼動している場合には、影響はもう少し広いと考えられます。
対策について。Webアプリケーション側でこの問題に対応するには、さしあたっては、セッションIDの妥当性確認を行えばよいと思います。セッションIDが英数字のみで構成されているか、あるいは16進文字列として妥当であるかをチェックすれば、パストラバーサルは防げます。
また、この問題はPHPがSession Adoptionの問題があることに起因していますから、Strict Sessin Patchを適用すれば、上記問題も解消されると思います。しかし、その場合でも、防衛的意味でパス・トラバーサル対策としての文字種チェックはしておくべきでしょう。
session_set_save_handlerを使わない状態のPHPでは、パス・トラバーサルの問題は起きないようです。前述の中途半端な文字種チェックといい、session_set_save_handlerを使う場合と使わない場合の挙動の違いといい、ちょっと「イラっ」と来たことを告白します。
なお、この問題を一応脆弱性情報としてIPAに届出ましたが、独立したソフトウェア製品ではないという理由で不受理となりましたので、ここに公開し、PHPの開発者に注意を喚起するものです。
Windows上のPHP 5.2.6およびCentOS 5.2上のPHP 5.1.6で検証しました。
続きです。この脆弱性により、任意のコマンドを実行できることを報告します。
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/ ×193
- http://bakera.jp/ebi/topic/3217 ×170
- http://bakera.jp/ebi ×68
- http://blog.ohgaki.net/php-session ×60
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/200... ×42
- http://www.tokumaru.org/ ×22
- http://blog.ohgaki.net/ ×13
- http://blog.ohgaki.net/php/ ×9
- http://codezine.jp/bookmark/hatena.aspx ×8
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×8
- http://yamagata.int21h.jp/d/ ×6
- http://d.hatena.ne.jp/ripjyr/20080819/1219108676 ×5
- http://d.hatena.ne.jp/ripjyr/ ×5
- http://yamagata.int21h.jp/d/?year=2008;month=2H;ca... ×4
- http://yamagata.int21h.jp/d/?date=20080819 ×4
- http://blog.ohgaki.net/?blog=7&paged=2 ×3
- http://www.tokumaru.org/JavaScript/ ×3
- http://clip.livedoor.com/page/2644944/徳丸浩の日記 - PHP... ×3
- http://bakera.jp/ebi/2008/8/20 ×3
- http://bakera.jp/ebi/topic/3133 ×3
- http://anond.hatelabo.jp/ ×3
- http://codezine.jp/bookmark/?dt=20080817&g=php ×2
- http://ucb.clipp.in/entry/17609 ×2
- http://b.hatena.ne.jp/entry/http://blog.ohgaki.net... ×2
- http://planet.php.gr.jp/delphinus.php ×2
- http://www.hash-c.co.jp/ ×2
- http://buzzurl.jp/entry/http://www.tokumaru.org/d/... ×2
- http://b.hatena.ne.jp/ockeghem/ ×2
- http://anond.hatelabo.jp/keyword/パストラバーサル ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×2
- http://fastladder.com/subscribe/http://www.tokumar... ×2
- http://mgw.hatena.ne.jp/?url=http://www.tokumaru.o... ×2
- http://b.hatena.ne.jp/t/php ×2
- http://www.tokumaru.org/d/20080818.html ×2
- http://it.kndb.jp/bookmark/7198 ×2
- http://twitter.com/ockeghem ×1
- http://www.tokumaru.org ×1
- http://b.hatena.ne.jp/sasahira/favorite?of=20 ×1
- http://anond.hatelabo.jp/?page=5 ×1
- http://b.hatena.ne.jp/kirikiris/favorite ×1
- http://b.hatena.ne.jp/t/セキュリティ ×1
- http://b.hatena.ne.jp/t/php?threshold=3 ×1
- http://209.85.175.104/search?q=cache:KKFgY7lheMEJ:... ×1
- http://209.85.175.104/search?q=cache:s8oxf9BGJw4J:... ×1
- http://b.hatena.ne.jp/Kanatoko/favorite ×1
- http://b.hatena.ne.jp/mi1kman/favorite ×1
- http://b.hatena.ne.jp/nilnil/favorite ×1
- http://b.hatena.ne.jp/HiromitsuTakagi/ ×1
- http://209.85.175.104/search?q=cache:ErDNPcj0ZdwJ:... ×1
- http://b.hatena.ne.jp/t/php?threshold=5 ×1
- http://xn--n8j3a4dxap8m.gaasuu.com/user/HiromitsuT... ×1
- http://buzzurl.jp/user/myid2 ×1
- http://d.hatena.ne.jp/minechi_n/searchdiary?of=5&w... ×1
- http://blog.ohgaki.net/index.php/yohgaki ×1
- http://d.hatena.ne.jp/ripjyr/200808 ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=SQ... ×1
- http://b.hatena.ne.jp/mikihoshi/favorite ×1
- http://www.hash-c.co.jp/d/ ×1
- http://bakera.jp/ebi/topic ×1
- http://209.85.175.104/search?q=cache:t4Ux8QYXLioJ:... ×1
- http://209.85.175.104/search?q=cache:Zeiqg3TjtBUJ:... ×1
- http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/... ×1
- http://bakera.jp/ebi/2008/8 ×1
- http://clipp.in/history?address=http://www.tokumar... ×1
- http://d.hatena.ne.jp/fbis/20060524/1148449927 ×1
- http://anond.hatelabo.jp/keyword/つ旦 ×1
- http://b.hatena.ne.jp/woremacx/favorite ×1
- http://b.hatena.ne.jp/fbis/favorite ×1
- http://codezine.jp/bookmark/?dt=20080819 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×1
- http://b.hatena.ne.jp/entrylist?url=http://&sort=h... ×1
- http://katoo.kndb.jp/security/bookmark/show/28543 ×1
- http://a.hatena.ne.jp/yamagata21/ ×1
- http://blog.ohgaki.net/language/ ×1
- http://b.hatena.ne.jp/mi1kman/ ×1
- http://r.hatena.ne.jp/fm8002/セキュリティ関係/ ×1
- http://twitter.com/teknocat/statuses/891712317 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=350&th... ×1
- http://blog.ohgaki.net/security/ ×1
- http://b.hatena.ne.jp/entrylist?url=http://www.tok... ×1
- http://labs.cybozu.co.jp/blog/takesako/2007/08/lls... ×1
- http://209.85.175.104/search?q=cache:t4Ux8QYXLioJ:... ×1
- http://a.hatena.ne.jp/SFNDS/simple?gid=411440 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×1
- http://b.hatena.ne.jp/hiro_y/ ×1
- http://clipp.in/ ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=250&th... ×1
- http://written.4403.biz/archives/2008/07/ ×1
- http://codezine.jp/bookmark/hatena.aspx?g=ruby ×1
- http://d.hatena.ne.jp/ripjyr/20080819 ×1
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×1
- http://hiroy.clipp.in/follow ×1
- http://search.live.com/results.aspx?q=ラジオボタン リクエスト... ×1
- http://209.85.175.104/search?q=cache:FC8LJ8TBxK4J:... ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×1
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/?08... ×1
- http://buzzurl.jp/user/ykkyy ×1
- http://cocoiti.clipp.in/ ×1
- http://ucb.clipp.in/tag/php ×1
- session_set_save_handler ×43 / php session_set_save_handler ×8 / キーワード不明 ×7 / 画像 xss ×6 / 徳丸 画像 xss ×5 / php 日記 ×4 / PHP session_set_save_handler ×4 / イメージファイト クロスサイトスクリプティング ×4 / session_set_save_handler 脆弱性 ×4 / パストラバーサル ×3 / sql エスケープ ×3 / php サンプル ×3 / mssql エスケープ ×2 / session_set_save_handler SESSION変数 ×2 / session adaption ×2 / パストラバーサル 対策 ×2 / php 5.1.6 脆弱性 ×2 / php パス ×2 / mod_imagefight, ×2 / テスト 更新系 値検証 Java ×2 / sql 複文 ×2 / 徳丸浩 ×2 / session_set_save_handler() ×2 / javascript break ×2 / php セッション管理 サンプル ×2 / php file_get_contents 脆弱性 ×1 / php ファイルトラバーサル ×1 / php read session_set_save_handler ×1 / centos php セッション管理 ×1 / イメージ BMP ×1 / エスケープ処理 MySQL ×1 / xss サンプル ×1 / PHP windonws ファイルパス ×1 / PHP session_set_save_handler SQL ×1 / php セッションid 形式 ×1 / PHPSESSID 脆弱性 ×1 / 画像ファイルでphp サンプル ×1 / PHP サンプル 日記 ×1 / PHPSESSID ID PASS サンプル ×1 / php-5.1.6 脆弱性 ×1 / php セッション 状態 確認 コマンド ×1 / マニュアル サンプル ×1 / PHP 日記 サンプル ×1 / session adoption 対策 ×1 / PHP セッション管理 サンプル ×1 / XSS 対策 ×1 / php マニュアル session_set_save_handler ×1 / session_set_save_handler サンプル ×1 / php 5.1.6 xss ×1 / php sql サンプル ×1 / Session Adaption ×1 / php sess_ ファイル ×1 / centos php ユーザ権限 ×1 / SQL エスケープシーケンス ×1 / SQL エスケープ ×1 / php Session Adoption ×1 / ブラックリスト ホワイトリスト ×1 / php パス トラバーサル対策 ×1 / パストラバーサル php ×1 / php 5.2.6 脆弱性 セッション ×1 / waf ホワイト ×1 / パストラバーサル php ×1 / SQL & 文字の変換 ×1 / http://www.tokumaru.org/d/ ×1 / php クロスサイトスクリプティング サンプル ×1 / 文字チェック PHP サンプル ×1 / php Strict Session ×1 / file_get_contents トラバーサル ×1 / php サンプル ×1 / xss テスト ×1 / パス・トラバーサル対策 ×1 / 標準sql エスケープ ×1 / パス・トラバーサル 対策 ×1 / 複文 無効 設定 ×1 / Apache パス・トラバーサル 対策 ×1 / session adoption ×1 / php sql server sample ×1 / PHP "?PHP" ×1 / http://www.tokumaru.org/d ×1 / PHP 脆弱性 チェック ×1 / php session 範囲 ×1 / php 任意のファイル 変数 ×1 / php 脆弱性 チェック ×1 / php ファイルパス チェック ×1 / PHP 脆弱性 ファイル名 ×1 / sqlインジェクション対策 ×1 / OSコマンドインジェクション fopen php ×1 / session_set_save_handler セッション開始後 ×1 / php 保存 リファレンス ×1 / セッショントラバーサル ×1 / HTML 入力値 セキュリティ ×1 / session_set_save_handler read ×1 / 脆弱 php 文字種 ×1 / php リファレンス サンプル ×1 / php 日記 サンプル ×1 / "php session_set_save_handler" -hatena ×1 / HASHコンサルティング ×1 / PHP セッション管理 サンプル sql ×1 / php 文字種 チェック ×1 / php リファレンス ->とは ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |