旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

「PHPサイバーテロの技法―攻撃と防御の実際」の書評?

2010年1月4日

この本が

PHPサイバーテロの技法―攻撃と防御の実際

 「どおーせでやることねーんだろ?
  じゃあ、読みやがれ!」

という会社の思惑(やや誇張)で、年末に自宅に強制送付されてきたので、
今更々々もいいとこですが(2005末の本!)読みました。 暇だし。

ざっくり感想・所感

とても良い本でした。

PHPで受託の仕事をしてて、
「俺ハッカーだぜ!」という自信の無い人は、読むと良いです。
(ぼくは無い)

セキュリティホールの解説と一般的な対応だけに終始せず、
PHPとしてはどう解決するのか?という点に踏み込んでやってくれるので、
他言語メインの人には、特にオススメです。
(PHPソース修正で解決 or .htaccessで解決 or httpd.confで解決 など
 状況を考慮して複数案出してくれるのが、さらに現実的で良い)

ネタの構成も良くて、
最初は上記のような各論から入り、
最後の方では、「そもそも何でWebだとこんな面倒なのか、考えてみようよ」
ということで、総論的なソフトウェア設計の話にも踏み込んでいます。

各論で頭の材料が溜まってる状態の人なら、
これで設計の肝となる部分が、すんなり頭に入る可能性も高そうです。

というところで

以下は本書を読んで、
トピック的に直接勉強になった点を、記憶の限り記述します。

XSSとかSQLインジェクションとかの本書の最も大事な点からは外れてますが、
その辺は、全部書いても仕方ないので、ご勘弁をということで。

(1) CSRF対策でのリファラチェックは有効

「リファラは偽装可能なので、無意味じゃん!」
・・・そう思ってた時期が、俺にもありました。

CSRF場合は、実際にリクエストを送るのは
被害者当人(リファラの偽装はする訳ない)なので、
「正しいリファラか?」のチェックは有効に機能するとのこと。 確かに!

ただし、事前に
「リファラ送信無し設定のユーザ数の調査」やら、
その方達をどう扱うのかという点については、要検討ですけど。

(2) XSSはリンクに仕込むことも出来る

“javascript:”があるので、アンカータグのhref属性にも仕込み可能。
そりゃそうだよね って、ある程度の技術者なら思うだろうけど、
いざという時に考えから漏れそうな気がする。改めて認識。

(3) $_SERVER[‘HTTP_*’]

・・・は、クライアントのHTTPリクエストのヘッダ情報らしい。
(すみません、詳しくは未確認)

$_SERVER[‘REMOTE_ADDR’] があるのに、
なんで $_SERVER[‘HTTP_CLIENT_IP’] もあるのかと思ったことがあった。

本書では、だから改竄可能だよね、という文脈で。

(4) preg_replaceのe修飾子

下記のように、$replacement 引数を eval として評価する
っていう、修飾子があるみたい。

<?php
$pattern = '/([def]+)/e';
$replacement = 'strtoupper($1)'; // ※"$1"は正規表現の後方参照の変数
$subject = "abcdefghi";
var_dump(preg_replace($pattern, $replacement, $subject)); // -> "abcDEFghi"

本書では、「要はevalなんでセキュリティホールになることもある」
という話でした。

・・・確かにその通りなんすけど、
後方参照をスクリプトで加工できるのは、結構便利かもとも思った。
(にしたってなので、公的な場所では使わないけど)

マニュアル: preg_replace

(5) IEで画像ファイルをhtmlとして実行するバグ

例えば、IE6またはIE7 と FireFox それぞれで
以下のgifリンクを踏んでみてください。

http://kjirou.net/main/public/ml/html-others/ie_bug_gif_as_html.gif

IE6とIE7の場合は、これを text/html として実行しちゃいます。
(内容とapplicationの指定が合わない場合のデフォルトがこれらしい。
なお、IE8の場合は、 text/plain として解釈される)

これが何を意味するかというと、
拡張子チェックだけの「画像アップローダー」は、
つまりは任意のhtmlをアップしまくれる、ということになります
・・・ひでー仕様だ・・・。

・・・ん? そこの君!
悪いことを考えてないですよね!?

(6) 任意のFlash=任意のJavaScript

「任意のFlashがアップできてしまう」環境は、
「任意のJavaScriptが実行されてしまう」という環境と
ほぼ等価だと考えた方がいいとのこと。
as/flaは初心者もいいところなので、こう書いてくれると助かる。

(7) GET値でユーザへのレスポンスヘッダを改ざん

どうセキュリティホールになるのかは置いておきます。

例えば、リクエストのGET値に書いたセッションIDが、
そのままSet-Cookieでレスポンスとして返るような場合があるとします。
(一言で言うと、Session Fixation攻撃の的になるような)

その場合、

任意のリンクを踏ませることで
 ↓
ユーザのレスポンスヘッダをSet-Cookieを介して改竄できる

ということにもなるということです。
この経路は十津川警部じゃないと気付かない。

蛇足

おー、この辺を見ると、
過去、かの有名SSLerとバトルってるのか・・・。

筆者は、SEとして問題解決をする目線で、
もう片方は研究者・権威者としての目線での発言なので、
そもそも戦ってる点がズレてるけども。