精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當前位置:安全行業動態 → 正文

利用內容安全策略探測網站登陸狀態(1)

責任編輯:editor005 |來源:企業網D1Net  2015-01-13 13:40:04 本文摘自:51CTO

0x01 內容安全策略(Content Security Policy,簡稱CSP)簡介

內容安全策略(Content Security Policy,簡稱CSP)是一種以可信白名單作機制,來限制網站中是否可以包含某來源內容。默認配置下不允許執行內聯代碼

[script ]塊內容,內聯事件,內聯樣式 ,以及禁止執行eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。

CSP更詳盡的介紹可以在drops看到:http://drops.wooyun.org/tips/1439

0x02 大環境介紹與原理

簡單了解一下CSP,我們知道CSP可以限制網站中可否包含某來源的內容。同時,csp還可以在頁面違反規則的時候發送一個數據包,將具體細節通知給服務端。

我們再來想想像支付寶這種集成度很高的網站服務,當我們在未登錄的情況下訪問alipay的某個子域名(如test.alipay.com),很可能是會302跳轉到一個用戶登陸專用的域名(如login.alipay.com)下要求用戶登錄。而在已登錄的情況下是不會跳轉的。

這就造成了一個登錄/未登錄的一個差別,主要差別如下:

HTTP狀態碼(302和200)

最終訪問的域名(test.alipay.com和login.alipay.com)

因為瀏覽器SOP(同源策略)的限制,正常情況下我們是無法獲取到alipay域名下HTTP狀態碼的。

但結合CSP安全策略,我們卻可以簡單獲得第2個,也就是最終訪問域名。為什么?

我前面說了CSP是可以限制頁面中允許加載哪些來源的內容的。所以,當我們將CSP設置為只接受來源為test.alipay.com的內容,那么當加載來源為login.alipay.com的請求時就會被CSP策略拒絕,并可以將這個訪問report給服務端,我們通過report的內容就能判斷用戶訪問的是test還是login。 過程如下:

enter image description here

  這就是原理,很贊的一個思路,再次崇拜一次@/fd。

[page]

0x03 以支付寶為例編寫探測代碼

所以,根據上面的思路,我們第一步就是找到一個這樣的頁面:登錄、未登錄用戶訪問時到達的“域名”不相同。這里的“域名”包括protocol和hostname,也就是說http://test.alipay.com和https://test.alipay.com是不同的域名。

像支付寶這種網站有很多這樣的頁面,因為支付寶的很多服務是登錄用戶才能查看的,而登錄入口又只有那么一個。

比如這個URL:https://my.alipay.com/portal/i.htm,當未登錄用戶訪問的時候會跳轉到https://auth.alipay.com/login/index.htm,已登錄用戶訪問時不會跳轉。

這時候我們將CSP的img-src限制為https://my.alipay.com,再將https://my.alipay.com/portal/i.htm作為img的src,這個時候就會出現一個有趣的現象:未登錄的用戶訪問時,會觸發CSP規則。

因為未登錄的用戶訪問時實際img加載的src是https://auth.alipay.com/login/index.htm,不符合CSP限制的img-src,自然就觸發規則了。 這時候我們在設置CSP的report-uri為report.php,不符合規則的請求會被記錄下作為日志發送到report.php里:

enter image description here

不過瀏覽器在發送這個report包的時候是不帶cookie的,所以服務器那邊并不能直接判斷是哪個用戶發送的report包,所以我們在report的GET參數里帶上用戶的session id。

示例代碼如下:

 

session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

?>  session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

>  session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

>

 

 

 

 

 

 

  

<script type="text/javascript">

function check()

{

with(new XMLHttpRequest) {

open('GET', 'alipay.php');

send();

onreadystatechange = function() {

if (readyState ^ 4) return;

result.innerHTML = parseInt(responseText) > 0 ? '未登錄' : '已登錄';

}

}

}

</script>

 

report.php用來記錄:

 

session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

?>  session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

>  session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

>

當接收到php://input的時候說明CSP發送報告了,說明請求違反的CSP規則了,也就意味著用戶沒有登錄,所以將session中的nologin設置為1。 然后在index.php里用一個ajax來向alipay.php請求,實際上就是獲得$_SESSION[nologin]的值:

 

session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

?>  session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

>  session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

>

如上,獲取完后將session清除一下,以免影響下一次的判斷。

獲得值如果為1的話,說明沒有登錄,如果為0說明已登錄,就可以顯示出來或做任何其他操作了。

來個演示:http://mhz.pw/game/detect/alipay/

登錄支付寶以后訪問,顯示“已登錄”

換個瀏覽器,直接訪問則顯示“未登錄”:

enter image description here

[page]

0x04 由http/https混用造成的問題(百度為例)

同樣的問題,不僅僅是支付寶存在,只要有“統一登錄入口”的網站都可能出現這個問題,因為統一登錄入口通常是一個單獨的域名。

還有一種情況,是http和https混用造成的。有些網站的登錄頁面是https加密傳輸的,但登陸以后實際的操作頁面是走http。

這之間一樣存在一個跳轉的問題,當我們訪問一個登陸后才能看到的頁面如http://xxx.com/index,未登錄的用戶就會跳轉到登錄頁面,如https://xxx.com/login。

在CSP里http和https是完全不同的兩個來源,所以也能觸發CSP規則。

比如https://passport.baidu.com,這是百度的安全中心。當已登錄用戶訪問的時候會跳轉到“安全中心”首頁http://passport.baidu.com/center(注意,此處是http):

而未登錄用戶訪問則會跳轉到https://passport.baidu.com/v2/?login(這時候是https):

enter image description here

雖然兩個域名都是passport.baidu.com,但因為protocol不同,混用的http和https就能夠影響CSP的攔截情況。

我們將CSP設置為img-src https://passport.baidu.com ,那么img的src就只接受來源為https://passport.baidu.com的img,那么已登錄用戶訪問的http://passport.baidu.com/center就會被阻止,產生一個CSP報告。記錄下這個報告,一樣能判斷訪客是否已登錄百度。

測試你是否登錄百度:http://mhz.pw/game/detect/baidu/

0x05 影響及防范方法

嚴格來論,只是判斷用戶是否登錄,這個問題并不算一個漏洞。當時@/fd將問題提交到推特之后推特的回應也是不算漏洞,但確實如果與其他一些漏洞結合使用,會讓某些漏洞的成功率提高一大截。所以我們可以將之歸為一個“奇技淫巧”。

這個問題更容易出現在一些大型網站、企業網絡之中,往往這些網站的統一性和重用性都做的很好,所以往往登錄入口只有一個(現在流行一個user center的概念),所以難免會出現一些跳轉的問題。有這些跳轉,就是探測用戶登錄的基礎。

這個方法還有一個限制,就是用戶使用的瀏覽器需要是現代瀏覽器,需要支持CSP安全策略。如果你要探測的用戶還在用IE6~IE10,那么是肯定不行的。 如何解決這個問題?如果你真的覺得這是個安全問題的話,那么盡量避免跳轉,或者使用javascript進行頁面的跳轉。

關鍵字:支付寶comalipay

本文摘自:51CTO

x 利用內容安全策略探測網站登陸狀態(1) 掃一掃
分享本文到朋友圈
當前位置:安全行業動態 → 正文

利用內容安全策略探測網站登陸狀態(1)

責任編輯:editor005 |來源:企業網D1Net  2015-01-13 13:40:04 本文摘自:51CTO

0x01 內容安全策略(Content Security Policy,簡稱CSP)簡介

內容安全策略(Content Security Policy,簡稱CSP)是一種以可信白名單作機制,來限制網站中是否可以包含某來源內容。默認配置下不允許執行內聯代碼

[script ]塊內容,內聯事件,內聯樣式 ,以及禁止執行eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。

CSP更詳盡的介紹可以在drops看到:http://drops.wooyun.org/tips/1439

0x02 大環境介紹與原理

簡單了解一下CSP,我們知道CSP可以限制網站中可否包含某來源的內容。同時,csp還可以在頁面違反規則的時候發送一個數據包,將具體細節通知給服務端。

我們再來想想像支付寶這種集成度很高的網站服務,當我們在未登錄的情況下訪問alipay的某個子域名(如test.alipay.com),很可能是會302跳轉到一個用戶登陸專用的域名(如login.alipay.com)下要求用戶登錄。而在已登錄的情況下是不會跳轉的。

這就造成了一個登錄/未登錄的一個差別,主要差別如下:

HTTP狀態碼(302和200)

最終訪問的域名(test.alipay.com和login.alipay.com)

因為瀏覽器SOP(同源策略)的限制,正常情況下我們是無法獲取到alipay域名下HTTP狀態碼的。

但結合CSP安全策略,我們卻可以簡單獲得第2個,也就是最終訪問域名。為什么?

我前面說了CSP是可以限制頁面中允許加載哪些來源的內容的。所以,當我們將CSP設置為只接受來源為test.alipay.com的內容,那么當加載來源為login.alipay.com的請求時就會被CSP策略拒絕,并可以將這個訪問report給服務端,我們通過report的內容就能判斷用戶訪問的是test還是login。 過程如下:

enter image description here

  這就是原理,很贊的一個思路,再次崇拜一次@/fd。

[page]

0x03 以支付寶為例編寫探測代碼

所以,根據上面的思路,我們第一步就是找到一個這樣的頁面:登錄、未登錄用戶訪問時到達的“域名”不相同。這里的“域名”包括protocol和hostname,也就是說http://test.alipay.com和https://test.alipay.com是不同的域名。

像支付寶這種網站有很多這樣的頁面,因為支付寶的很多服務是登錄用戶才能查看的,而登錄入口又只有那么一個。

比如這個URL:https://my.alipay.com/portal/i.htm,當未登錄用戶訪問的時候會跳轉到https://auth.alipay.com/login/index.htm,已登錄用戶訪問時不會跳轉。

這時候我們將CSP的img-src限制為https://my.alipay.com,再將https://my.alipay.com/portal/i.htm作為img的src,這個時候就會出現一個有趣的現象:未登錄的用戶訪問時,會觸發CSP規則。

因為未登錄的用戶訪問時實際img加載的src是https://auth.alipay.com/login/index.htm,不符合CSP限制的img-src,自然就觸發規則了。 這時候我們在設置CSP的report-uri為report.php,不符合規則的請求會被記錄下作為日志發送到report.php里:

enter image description here

不過瀏覽器在發送這個report包的時候是不帶cookie的,所以服務器那邊并不能直接判斷是哪個用戶發送的report包,所以我們在report的GET參數里帶上用戶的session id。

示例代碼如下:

 

session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

?>  session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

>  session_start();

$ssid = session_id();

header("Content-Security-Policy:img-src https://my.alipay.com; report-uri report.php?ssid={$ssid}");

>

 

 

 

 

 

 

  

<script type="text/javascript">

function check()

{

with(new XMLHttpRequest) {

open('GET', 'alipay.php');

send();

onreadystatechange = function() {

if (readyState ^ 4) return;

result.innerHTML = parseInt(responseText) > 0 ? '未登錄' : '已登錄';

}

}

}

</script>

 

report.php用來記錄:

 

session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

?>  session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

>  session_start();

if (preg_match('/^[a-z0-9]*$/i', $_GET['ssid'])) {

session_id($_GET['ssid']);

}else{

exit;

}

$report = file_get_contents("php://input");

if (!emptyempty($report)) {

$_SESSION['nologin'] = 1;

}else{

$_SESSION['nologin'] = 0;

}

>

當接收到php://input的時候說明CSP發送報告了,說明請求違反的CSP規則了,也就意味著用戶沒有登錄,所以將session中的nologin設置為1。 然后在index.php里用一個ajax來向alipay.php請求,實際上就是獲得$_SESSION[nologin]的值:

 

session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

?>  session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

>  session_start();

echo isset($_SESSION['nologin']) ? $_SESSION['nologin'] : 0;

setcookie('PHPSESSID', '', time() - 10);

session_destroy();

>

如上,獲取完后將session清除一下,以免影響下一次的判斷。

獲得值如果為1的話,說明沒有登錄,如果為0說明已登錄,就可以顯示出來或做任何其他操作了。

來個演示:http://mhz.pw/game/detect/alipay/

登錄支付寶以后訪問,顯示“已登錄”

換個瀏覽器,直接訪問則顯示“未登錄”:

enter image description here

[page]

0x04 由http/https混用造成的問題(百度為例)

同樣的問題,不僅僅是支付寶存在,只要有“統一登錄入口”的網站都可能出現這個問題,因為統一登錄入口通常是一個單獨的域名。

還有一種情況,是http和https混用造成的。有些網站的登錄頁面是https加密傳輸的,但登陸以后實際的操作頁面是走http。

這之間一樣存在一個跳轉的問題,當我們訪問一個登陸后才能看到的頁面如http://xxx.com/index,未登錄的用戶就會跳轉到登錄頁面,如https://xxx.com/login。

在CSP里http和https是完全不同的兩個來源,所以也能觸發CSP規則。

比如https://passport.baidu.com,這是百度的安全中心。當已登錄用戶訪問的時候會跳轉到“安全中心”首頁http://passport.baidu.com/center(注意,此處是http):

而未登錄用戶訪問則會跳轉到https://passport.baidu.com/v2/?login(這時候是https):

enter image description here

雖然兩個域名都是passport.baidu.com,但因為protocol不同,混用的http和https就能夠影響CSP的攔截情況。

我們將CSP設置為img-src https://passport.baidu.com ,那么img的src就只接受來源為https://passport.baidu.com的img,那么已登錄用戶訪問的http://passport.baidu.com/center就會被阻止,產生一個CSP報告。記錄下這個報告,一樣能判斷訪客是否已登錄百度。

測試你是否登錄百度:http://mhz.pw/game/detect/baidu/

0x05 影響及防范方法

嚴格來論,只是判斷用戶是否登錄,這個問題并不算一個漏洞。當時@/fd將問題提交到推特之后推特的回應也是不算漏洞,但確實如果與其他一些漏洞結合使用,會讓某些漏洞的成功率提高一大截。所以我們可以將之歸為一個“奇技淫巧”。

這個問題更容易出現在一些大型網站、企業網絡之中,往往這些網站的統一性和重用性都做的很好,所以往往登錄入口只有一個(現在流行一個user center的概念),所以難免會出現一些跳轉的問題。有這些跳轉,就是探測用戶登錄的基礎。

這個方法還有一個限制,就是用戶使用的瀏覽器需要是現代瀏覽器,需要支持CSP安全策略。如果你要探測的用戶還在用IE6~IE10,那么是肯定不行的。 如何解決這個問題?如果你真的覺得這是個安全問題的話,那么盡量避免跳轉,或者使用javascript進行頁面的跳轉。

關鍵字:支付寶comalipay

本文摘自:51CTO

電子周刊
回到頂部

關于我們聯系我們版權聲明隱私條款廣告服務友情鏈接投稿中心招賢納士

企業網版權所有 ©2010-2024 京ICP備09108050號-6 京公網安備 11010502049343號

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 江安县| 沿河| 横峰县| 佛坪县| 无为县| 高清| 土默特右旗| 武清区| 金平| 乐业县| 乌什县| 惠水县| 新田县| 建湖县| 达州市| 项城市| 通州市| 商水县| 泰顺县| 新化县| 会理县| 正宁县| 永吉县| 南康市| 鲁山县| 三亚市| 玉树县| 历史| 吉木萨尔县| 大余县| 武平县| 赤城县| 碌曲县| 来凤县| 萝北县| 郸城县| 三亚市| 南郑县| 博客| 东台市| 泰顺县|