天天看點

P3P Header Tips

關于P3P,還是有必要講一下。好像之前我和朋友讨論網易那個跨域實作的時候忘記講清楚了,那個P3P頭是必須要的,後面的 set-cookie 才能成功。

對于IE來說(預設安全級别下),iframe、img、link等标簽都是隻發送session cookie(又叫 第一方cookie),攔截本地cookie發送(又叫第三方cookie)。當這些标簽跨域引用一個頁面,實際上是發起了一次GET請求。

如果這個跨域的請求,HTTP傳回頭中帶有Set-Cookie , 那麼這個cookie對浏覽器來說,實際上是無效的。

看如下測試

假設有 www.a.com    與 www.b.com 兩個域

在 www.b.com 上有一個頁面,其中包含一個指向 www.a.com 的iframe

http://www.b.com/test.html 的内容為:

----------------------------------------------------------------------

<iframe width=300 height=300 src="http://www.a.com/test.php" ></iframe>

http://www.a.com/test.php 是一個對 a.com 域設定 cookie的頁面,其内容為:

<?php

header("Set-Cookie: test=axis; domain=.a.com; path=/");

?>

<script>

    alert(document.cookie);

</script>

此時我們請求 http://www.b.com/test.html , 他包含一個iframe,會去跨域請求 www.a.com/test.php ,該php頁面會嘗試 set-cookie

第一次請求, test.php 會 set-cookie,是以浏覽器會收到一個cookie。

如果 set-cookie 成功,再次請求該頁面,浏覽器應該會 sent 剛才 recieve 到的cookie。可是由于前面說的跨域限制,在IE裡的iframe标簽是 set-cookie不成功的,是以無法sent剛才收到的cookie。

這裡無論是 session cookie 還是本地cookie都是一樣。

P3P Header Tips

可以看到,第二次發包,還是沒能sent出去cookie

但是這種情況在加入了P3P header 後會改變。

P3P header允許跨域通路隐私資料,進而可以跨域set-cookie成功

我們修改 www.a.com/test.php 為

header("P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");

header("Set-Cookie: test=axis; expires=Sun, 23-Dec-2018 08:13:02 GMT; domain=.a.com; path=/");

再次通路兩次上面的測試過程

P3P Header Tips

可以看到第二個包已經發送出了收到的cookie

而我們寫的javascript也能夠彈出cookie了。

值得注意的是,P3P header隻需要設定一次,這樣跟在這個P3P header後面的所有 set-cookie,都可以跨域通路了。也就是說:

被P3P header設定過一次後,之後的請求不再需要P3P header,也能夠在iframe裡跨域發送這些cookie。

但是如果用 set-cookie 去改變設定好的cookie,則不再具有這種跨域通路特性。

P3P header 還有一個特點就是同一個包裡隻能設定一次,後面的P3P Header不會覆寫前面的P3P header,浏覽器隻認第一個。

P3P 是 The Platform for Privacy Preferences 的簡稱

在這裡,我們看到的很亂的 P3P header裡的東西,都不知道是什麼亂七八糟的政策内容,實際上這是一些簡寫

比如 上面用到的

P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

CP 是 Compact Policy 的簡寫

CURa 中 CUR 是 <current/> 的簡寫, a 是 always 的簡寫

定義很多,我這裡摘部分标準中的内容

[57]

[58]

更多的内容可以參考上面提到的标準

當然P3P header也可以直接 引用一個 xml 政策檔案

比如這麼寫

使用P3P的方法還有很多,這裡不一一列舉了。

最後,利用P3P Header 的這種特性,在實際攻擊中,還是可以利用一下的。

比如利用CRLF插入一個P3P header後,改變一個本地cookie的值,該cookie在之後的過程中可以被iframe引用到,也許會發生一些很奇妙的事情。

具體會變成什麼樣我也不知道,畢竟web應用安全和環境的關系是越來越緊密了。