SOP,CORS,CSP 是什么,是做什么的,如何繞過?
來源:湖北國菱計算機(jī)科技有限公司-湖北國聯(lián)計算機(jī)科技有限公司-荊州網(wǎng)站建設(shè)-荊州軟件開發(fā)-政府網(wǎng)站建設(shè)公司
時間:2025-06-10
大家好,因為之前的文章中一些有小伙伴提內(nèi)容安全策略,還有同源策略等內(nèi)容,這篇文章一起講一下它們是什么,以及它們能做什么,還有如何繞過它們。
JSRPC
同源策略和內(nèi)容安全策略會影響JSRPC 代碼注入和執(zhí)行的過程,所以為了更好的進(jìn)行 JSRPC 注入,需要了解如何繞過它們。
同源策略
同源策略(Same-origin policy)是瀏覽器強(qiáng)制實施的一種安全機(jī)制,限制不同源的文檔或腳本之間的交互。默認(rèn)情況下,瀏覽器禁止非同源請求,除非目標(biāo)服務(wù)器明確返回 Access-Control-Allow-Origin 響應(yīng)頭。
同源的條件:協(xié)議、域名、端口三者必須完全相同。
目的:防止惡意網(wǎng)站執(zhí)行未經(jīng)檢查的惡意腳本竊取用戶數(shù)據(jù)或執(zhí)行惡意腳本攻擊其他網(wǎng)站。
說到同源策略,可能有小伙伴會疑惑,那跨域是啥?跨域這個詞在后端開發(fā)中經(jīng)常聽到,和同源策略有什么關(guān)系呢?
跨域是指從瀏覽器中發(fā)起的請求與當(dāng)前頁面來源不同,即違反同源策略,違反同源策略的請求會被瀏覽器拒絕。
例如從 https://aa.com 請求 https://bb.com 的數(shù)據(jù),會被瀏覽器攔截并且報錯提示用戶,我這里使用百度來演示:
image-20250331194830390
所以,同源策略和跨域的區(qū)別就是:同源策略是瀏覽器制定的安全規(guī)則,跨域是觸發(fā)該規(guī)則限制的請求或操作。
那如何繞過同源策略呢?有下面幾種方案:
1. 服務(wù)端設(shè)置響應(yīng)頭:Access-Control-Allow-Origin: * // 或指定域名,這種方式就叫做:跨源資源共享(CORS,或通俗地譯為跨域資源共享)
2. 通過 <script> 標(biāo)簽加載跨域腳本,也就是 JSONP,但是只支持 GET 請求。
3. 使用nginx 或者其他代理服務(wù)器進(jìn)行轉(zhuǎn)發(fā)。
4. 在瀏覽器的啟動參數(shù)中添加 --disable-web-security 參數(shù),可以臨時禁用同源策略,但是會降低瀏覽器的安全性,不要用于生產(chǎn)環(huán)境。
那應(yīng)該如何繞過同源策略呢?可以使用第一種方案,直接修改響應(yīng)頭。
注:websocket 協(xié)議默認(rèn)是不會受到同源策略限制的,可以隨意使用。
在proxyman 打個斷點,重新執(zhí)行剛才訪問百度的代碼,在 proxyman 中給訪問百度的請求手動添加請求頭 Access-Control-Allow-Origin,即可繞過同源策略訪問百度了。當(dāng)然了,如果是自己可控的服務(wù)器,可以直接在后端設(shè)置,就不用抓包了。
image-20250331203621767
image-20250331203329530
總結(jié)一下同源策略,說白了就是限制其他的網(wǎng)站讀取本服務(wù)器的響應(yīng),它保護(hù)的是服務(wù)器資源不被未授權(quán)的網(wǎng)站讀取。
內(nèi)容安全策略
內(nèi)容安全策略(Content Security Policy,簡稱CSP),相比于同源策略更加可靠,它是一種白名單機(jī)制,開發(fā)者明確配置哪些外部的資源可以執(zhí)行,在白名單以外的所有資源都不會被執(zhí)行。開發(fā)者只需要提供一些配置即可,瀏覽器會自動按照配置執(zhí)行。
內(nèi)容安全策略可以通過兩種方式啟用,一種是 Content-Security-Policy 請求頭,另一種是 <meta> 標(biāo)簽。
內(nèi)容安全策略可以控制是否加載圖片、腳本、AJAX和CSS資源,并且默認(rèn)情況下會禁止執(zhí)行 eval , newFunction , setTimeout 和setInterval。
如果一個網(wǎng)站開啟了內(nèi)容安全策略,那默認(rèn)情況下你無法在控制臺使用 document.head.append 添加一個外部源的腳本,并且內(nèi)容安全策略還會影響 Safari 瀏覽器中的油猴腳本的執(zhí)行,因為 Safari 中的拓展腳本會遵守網(wǎng)站的內(nèi)容安全策略,導(dǎo)致油猴腳本無法執(zhí)行。
同時因為設(shè)置了白名單,也能阻止一些攻擊,例如XSS。
那應(yīng)該如何繞過內(nèi)容安全策略呢?
部分的瀏覽器拓展可以通過瀏覽器拓展的網(wǎng)絡(luò)攔截Api 刪除掉網(wǎng)站設(shè)置的內(nèi)容安全策略請求頭,但是無法修改響應(yīng) body,也就導(dǎo)致了如果策略設(shè)置在 body 中的 <meta> 標(biāo)簽中,則無法繞過。這個時候可以嘗試使用這個瀏覽器拓展[1]來繞過,它會連接devtools 工具來攔截修改 Body,具體使用方式見項目中的readme。
還有一種方式就是通過中間人的方式來繞過。因為中間人是獨立于瀏覽器之外的,不會受到瀏覽器的任何限制,且可以隨意更改請求和響應(yīng),所以用它來繞過內(nèi)容安全策略再方便不過了。
來看一個示例:
image-20250331212223837
Github 默認(rèn)是啟動內(nèi)容安全策略的,并且在策略中配置了一大堆域名,也就是說默認(rèn)情況下,任何非 Github 域名的腳本都無法被加載和執(zhí)行。
嘗試一下加載外部的腳本,被拒絕了,提示它不是Github 官方的腳本。嘗試使用中間人的方式來繞過內(nèi)容安全策略,因為策略是設(shè)置在響應(yīng)頭中的,那么只需要打個斷點在響應(yīng)頭中刪掉它就好了。
image-20250331212754761
打個斷點,在響應(yīng)頭中,刪除圖中的這個響應(yīng)頭,然后點擊右下角的執(zhí)行。
image-20250331212830419
可以看到瀏覽器中的響應(yīng)頭中已經(jīng)沒有內(nèi)容安全策略對應(yīng)的響應(yīng)頭了。
image-20250331212907740
image-20250331212921118
并且在瀏覽器中加載外部的腳本不會報錯了,雖然這個腳本404 了,因為這個腳本本來就是不存在的,只是為了測試能否正常加載。
至此,就可以完全繞過內(nèi)容安全策略的保護(hù)了。如果嫌打斷點麻煩,可以使用上篇文章中提到的中間人腳本的方式實現(xiàn)自動化刪除內(nèi)容安全策略的響應(yīng)頭,同時也可以修改body 刪除對應(yīng)的 <meta> 標(biāo)簽,就可以完全繞過內(nèi)容安全策略的保護(hù)了。
總結(jié)
如果大家在實際的逆向中遇到了JSRPC 注入代碼被攔截的情況,可以使用上面的方式嘗試?yán)@過。
(轉(zhuǎn)載自:程序員指北)