PHPでCookieを設定する際の一般的なエラー

COOKIE値を設定するときに1つの機能を共有したいと思いますが、これはWeb開発者によって忘れられがちです。

2009〜2011年の脆弱性についてWebアプリケーションを調査する私の実践では、このエラーはPHPで書かれたWebアプリケーションの87%で発生しました。

このインジケータを何らかの形で減らすために、私はこのテキストを書くことにしました。



httpOnlyフラグについてでさえありませんが、その使用はそれほど重要ではなく、必須です。



コード例を考えてみましょう:

<?php setcookie('foo','bar1'); header('Set-cookie: foo1=bar11'); ?>
      
      







このコードは明らかに、fooとfoo1という名前の2つのCookie値を設定します。

今、主な質問はどのドメインとどのフラグに対するものですか?



元のソースであるWebサーバーのHTTPレスポンスを見てみましょう。

画像



ご覧のとおり、サーバーはドメインについてもフラグについても何も言っていません。

次に、質問は別のプレーンに移動します - ブラウザはそのようなヘッダーに対してどのドメインとフラグを選択しますか?



Chrome(現在のバージョン18.0.1025.168)の場合、すべてが適切であり、ドメインはリクエストの送信元とまったく同じになります。 私の例では、foo.bar.com:

画像



すべてがとても良ければ、おそらくここにテキストはないでしょう...



Internet Explorerを確認してください。 彼のCookieを表示するための美しいプラグインがわからないので、foo.comドメインのcookieを置き、bar.foo.comドメインのdocument.cookieを表示します。

画像



これはとても悲しいです。 一方、面白い。

サーバーのHTTP応答の受信時

Set-cookie: foo=bar





Internet Explorerは、すべてのサブドメインにfoo = barを設定します。つまり、httpOnlyなどのフラグなしの例では* .foo.comです。



監査を実行する際に私がしばしば果たすべき役割である攻撃者は、ターゲットホストのサブドメインでXSSを見つけるために残ります。これは実際には非常に簡単に実装できます。



しかし、他のブラウザはどうですか?

Firefox 12.0 httpOnly ワイルドカード
サファリ 5.1.5 httpOnly ワイルドカード
オペラ 11.62 httpOnly ワイルドカード




構造体を使用して

 setcookie('foo','bar1');
      
      





そして

 header('Set-cookie: foo1=bar11');
      
      





クライアントがInternet Explorer(8-9)を使用している場合、 このサブドメインのすべてのサブドメインにCookieを配置します



これを覚えて!



All Articles