通過瀏覽器緩存來bypass nonce script CSP
* 本文原創作者:LoRexxar,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
最近看了去年google團隊寫的文章CSP Is Dead, Long Live CSP!,對csp有了新的認識,在文章中,google團隊提出了nonce-{random}的csp實現方式,而事實上,在去年的聖誕節,Sebastian 演示了這種csp實現方式的攻擊方式,也就是利用瀏覽器緩存來攻擊,現在來詳細分析下。
漏洞分析
原文查看:
http://sirdarckcat.blogspot.jp/2016/12/how-to-bypass-csp-nonces-with-dom-xss.html
國內的翻譯(只有翻譯):
http://paper.seebug.org/166/
首先我需要個demo
首先是實現了nonce script的站,然後包含了因為是利用了瀏覽器緩存,所以我們不能對頁面發起請求,因為發起請求之後,後台就會刷新頁面並刷新nonce的字元串,符合條件的只有3種。
持久型 DOM XSS,當攻擊者可以強制將頁面跳轉至易受攻擊的頁面,並且 payload 不包括在緩存的響應中(需要提取)。
包含第三方 HTML 代碼的 DOM XSS 漏洞(例如,fetch(location.pathName).then(r=>r.text()).then(t=>body.innerHTML=t);)
XSS payload 存在於 location.hash 中的 DOM XSS 漏洞(例如 https://victim/xss#!foo?payload=)
這裡首先我們需要一個開啟了nonce script規則的站,並加入一個xss點
iframe引用
然後我們需要利用iframe引入這個頁面,並對其發起請求獲取頁面內容,這裡我們通過向其中注入一個
獲取nonce字元串
然後我們需要一個頁面去獲取nonce字元串,為了反覆獲得,這裡需要開啟session。
一切就緒了,唯一的問題就是在nonce script上,由於csp開啟的問題,我們沒辦法自動實現自動提交,也就是攻擊者必須要使按鈕被點擊,才能實現一次攻擊。
nonce繞過實例-pwnhub絕對防禦
為了研究整個漏洞的限制性,我專門寫了一個pwnhub的題目。題目環境大概是這樣的。
前台是個聊天版,可以發給任何人,有簡單的xss過濾,但是可以隨便繞過
在admin的聊天版里可以找到後台的信息,通過構造任意xss獲得後台地址。
Wow, good guys,maybe you want /adminshigesha233e3333/#admin
打開看一眼發現敏感信息
右鍵看源碼是這樣的
存在dom xss,看看返回頭還可以發現更多信息。
服務端不但開啟了最新版的nonce csp,而且還開啟了瀏覽器緩存
這就讓我們有了可乘之機,就如同上面提到的一樣,如果我們僅修改location.hash,瀏覽器不會請求伺服器,那麼nonce string就不會更換。
那麼思路就很清楚了,我們可以在主站構造xss,先開iframe請求admin目錄的,獲取到nonce值後,再新建一個iframe,添加帶有nonce字元串的iframe窗口,執行任意xss
總結
但是讓我回過頭來總結下上面的利用條件:
1、目標站開啟了緩存機制。
2、目標站同源下存在未被csp保護的存在xss的站點。
但事實上,我們本可以用更簡單的方式獲得目標站的flag,比如構造一個iframe引入flag.php,然後讀iframe內容,在同源的情況下是允許的。
payload如下
那麼如果admin站點和xss站點非同源呢?由於同源策略的影響,你不能從父窗口獲取子窗口的內容,那麼就只能通過點擊劫持的方式,來發送請求,payload如前面漏洞分析時講到的。
payload如下
如果被攻擊者點擊提交按鈕,那麼攻擊者就可以獲取想要的所有信息了。
回顧漏洞,我們不難發現整個漏洞處處都受到同源策略的限制,而且如果在chrome環境下,還會受到xss auditor的限制,所以雖然nonce script csp存在理論被繞過的可能,但是被作為CSP的新解決方案來說,前景仍然光明。
* 本文原創作者:LoRexxar,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
※Shodan新工具發布:木馬惡意軟體C&C伺服器搜索引擎
※如何創建Powershell持久隱蔽後門
※英特爾AMT功能遠程提權高危漏洞分析
※解碼內置不安全「加密晶元」的勒索軟體Gomasom
※一款高度可定製的WiFi釣魚工具 – WiFiPhisher
TAG:FreeBuf |
※SpringBoot:SpringDataRedis緩存改造
※Hitachi Vantara升級Skylaking伺服器加入Optane緩存和GPU
※TinyShop緩存文件獲取WebShell之0day
※redis緩存和cookie實現Session共享
※緩存架構SpringBoot集成Curator實現zookeeper分散式鎖
※python的緩存庫:cacheout
※Flutter圖片緩存 Image.network源碼分析
※Python + Memcached: 在分散式應用程序中實現高效緩存
※windows緩存
※Python+Memcached:在分散式應用程序中實現高效緩存
※Python + Memcached:在分散式應用程序中實現高效緩存
※MyBatis中的緩存
※使用RedisTemplate(JDK序列化策略)緩存實體類
※spring-boot-2.0.3之redis緩存實現
※int 和 Integer 有什麼區別?談談 Integer 的值緩存範圍
※Bloom Filter如何解決緩存穿透
※Linux下搭建高可用Redis緩存
※英特爾推出升級版Optane Memory M15緩存SSD
※Windows、Linux等系統遭遇頁面緩存旁路攻擊
※Spark調優的關鍵—RDD Cache緩存使用詳解