カテゴリー: Computer

PHP_SELFはそのまま出力できない

追記:現在のPHPでは$_SERVER[‘PHP_SELF’]はクエリ文字列(?以降のクエリパラメータ)を含みません。しかし、index.php/<script>alert(1)</script>/aaa/bbb とすることは可能です。PHP_SELFと同様の変数は以下です。

  • $_SERVER[‘PATH_INFO’]
  • $_SERVER[‘PATH_TRANSLATED’]

 

時々見かけるのでブログでも問題を指摘します。

PHPの$_SERVER配列に入っているPHP_SELF要素はPATHINFOも含めてしまうため、そのまま出力するとXSSに脆弱になる場合があります。

phpinfo()がXSSに脆弱だ、と指摘する人がいるので(元々phpinfo()の出力は管理者・開発者のみ参照できるようにしておくべきですが..)現在のPHPはPHP_SELF内の< > を検出して

<script> </script>

等と書けないようになっています。しかし、この対策はphpinfo()の事しか考えていないので

<?php
echo '<a href="'. $_SERVER['PHP_SELF'] .'">aaa</a>';
?>

の様なケースの場合、

http://example.com/xss.php/%22%20onMouseOver=%22javascript:alert(‘xss’);

等としてJavaScriptの挿入が可能になります。

SCRIPT_NAMEにはPATH情報が無いのでこの問題は発生しません。PHP_SELFでは無くSCRIPT_NAMEを使用すべき所をPHP_SELFを利用しているケースは時々見かけます。

注意が必要かもしれませんね。

UNIX系OSならPHPのソースがあるディレクトリに移動して

find . -name “*.php” | xargs grep -n “PHP_SELF”

等として怪しいPHP_SELFの出力が無いか確認すると良いかも?!

日本のアイドルサイトからのリファラSPAM?

久しぶりにブログへのSPAM掃除をしていたら、日本のアイドルサイトからのリファラSPAMと思われるログが複数ありました。

#リンクにならないようにhttpのhを削除しました。

ttp://suzukiairi.net/cgi-bin/up/upload.php?page=all
ttp://www.umedaerika.com/ume/uperika.php?page=all
ttp://melon-kinenbi.plala.jp/~ayumi/sam.php?start=100
ttp://ai-flavor.com/upload/flavorupload.php?page=all
ttp://www.sudomaasa.com/rabi/upmaasa.php?page=all

なにこれ?と思っていたところどうもこのアップローダ(正確にはサムネイルの表示スクリプト)にはXSS脆弱性があるようです。某サイトのサンプルファイルを修正して使っているようです。

このスクリプトはXSSに脆弱なのでファンが勝手にXSSに脆弱なスクリプトを利用してSAPMを送信したのか、とも思ったのですが同じIPアドレス(サーバのとは別のIP:xxx.87.1.155)のリファラであるためXSSを利用しているとは断定できません。書きませんがwhois情報を見ると…、となっています。

サーバ(多分このIPはプロキシ)がクラックされているか?内部のクライアントがクラックされているのか? 単純に内部の利用者によりプロモートするためにリファラSPAMが仕掛けられているのか?業者によるこれらのタレントのプロモーション用SPAMなのか?

他の業者とは異なるのは参照先のURLがトップページ固定ではなく、ほとんどが実在するURLをばらばらにリクエストしている所が新しいです。

とりあえず様子を見ることにします。

PHP 5.1でregister_globals=onには注意

5.1.0で直されていたはずなんですけど。記憶が確かなら。

え?という感じなのですがPHP 5.1.1, PHP 5.1.2にはシステムが初期化する配列にGLOBALSをチェックするコードを入れてなかったようです。自分では試してないですが簡単にチェックできるのでこのアドバイザリが間違っていることはないでしょう。

addslashesによるエスケープ処理は止めましょう

追記:PHPエスケープ関連の検索でこのエントリを参照されたと思います。PHPでのエスケープ全般については以下のエントリを参照してください。

PHP文字列のエスケープ

セキュリティmemoにaddslashesよるエスケープ処理でSQLインジェクションが可能なるという記事を見つけました。

私のセミナーを聞いたことがある方は「addslashesによるエスケープ処理は止めましょう」と言っていた事を覚えているでしょうか? mysql_real_escape_string()やpg_escape_string()等のデータベース専用のエスケープ関数を使いましょう、とも話しています。

ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNGです。もっと根本的に間違っています。SQLiteではMS SQL Server, Sybaseと同様「’」は「”」とシングルクオートでエスケープします。

基本には忠実に :)

追記:
サーバとクライアントのエンコーディングが合っていないと問題が発生します。PostgreSQLの場合、SET文でクライアントエンコーディングを変えるのではなくpg_set_client_encoding()を利用してエンコーディングを変えないとならないです。MySQLでも同様にアプリからSET NAMESでエンコーディングを変えるのはNGです。

addslashesでエスケープして良い物はPHPスクリプトとなる文字列型データです。

4 core CPUは来年はじめ

この記事によると4(Quad) core CPUは来年はじめにリリースされるらしい。現在は新しいデザインをレビューしている所だそうです。デスクトップPCにはPenium Dを使っていますがやはりDualの方がコンパイルが速くて使い心地が良いです。Quad-coreになると make -j6 くらいがちょうどかな?

Zend Japanの無料セミナー

来週にZendの無料セミナーがあるようです。
17日の金曜日には福岡であるようです。

・Zend Studio 5.1 による開発技法
・Zend Studio Enterprise によるデバックとチューニング

17日と言えばPostgreSQLカンファレンス2006がある(私も講師の一人)ので東京にはいます。もうほとんど目一杯らしいですがPostgreSQLのカンファレンスも今なら間に合う(?)かも?

pgpool 3.0.0 & global development team

http://pgfoundry.org/forum/forum.php?forum_id=668

によると

PgPool team is about to form “PgPool Global Development Group” whose concept is pretty similar to PostgreSQL Global Development Group. i.e. a virtual entity on the Internet. PgPool is currently being developed by Tatsuo Ishii. We want to switch to “PgPool Global Development Group” which will lower the barrier for hackers who wants to join this project.

と、チーム体制の開発に移行するそうです。素晴らしい  :)

Open Ajax

Ajax普及目指すオープンソースプロジェクト「Open Ajax」をIBMやその他の会社がはじめた、とニュースリリースがりました。

ApacheとMozilla Pulicライセンスに基づき公開されるAjaxランタイムツールキットを提供するZimbraのサイトにデモアプリケーションがありました。メールとスケール管理のアプリケーションですが、ここまでやれば従来型のクライアントサーバ型アプリケーションと変わらない状態です。

http://zimbra.com/products/hosted_demo.php

「Skip Registration, go to Demo」ボタンを押せばデモアプリケーションを利用できます。日本語対応も考えられている(?)らしく日時は日本語で表示されていました。

オープンソース化されるツールキットはこちら。
http://zimbra.com/community/ajaxtk_download.html

ページを見れば分かりますが、ApacheかMPLのどちらかのライセンスを選択できるようになっています。

参考
http://zimbra.com/community/open_ajax.html
http://www.itmedia.co.jp/enterprise/articles/0602/02/news011.html

Strict Session管理パッチ

PHPのセッションID管理がいまひとつであることは

http://blog.ohgaki.net/index.php/yohgaki/2005/12/24/strict_sessioncric

にも書きました。PHP 5.1.2用のパッチですがsqliteと一緒にコンパイルするとsqlite用のvalidationパッチが含まれていないのでビルドできませんでした。

MomongaLinux用にsqliteも一緒にビルドできるパッチを作成したのでWikiに載せました。もちろんSQLiteをセッションID管理に使用しても厳格なセッションID管理になります。必要な方は是非どうぞ。

http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession

追記:
厳格なセッションID管理を行うパッチを適用したPHPをインストールした後、php.iniに

session.use_strict_mode = 1

を追加してください。これを追加しないと厳格なセッションID管理になりません。

GPLv3 Draft

DRMに関わるコードにはGPLv3は使えない、GPLが適用されたプログラムに関わる特許権の行使の制限、が特に注目すべき箇所のようです。

allow_url_includeオプションの追加

CVS HEADでは昨年11月にallow_url_includeオプションが追加されています。allow_url_fopenからinclude/require文の設定を分離するオプションです。

このオプションを付けると万が一、

$dir = $_GET[‘dir’];
…..
…..
include($dir.$file);

の様なコードがあってもhttp://, ftp:// は使えなくなります。(SSL/TLSも)ただしphp://inputは使えます。ですから今ひとつなパッチですが無いよりましです。

私がPHP 5.1.2用にバックポート(ほとんどオリジナルと同じですが)はこちらです。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2Fallow_url_include