CSRF漏洞的挖掘與利用


0x01 CSRF的攻擊原理

CSRF 百度上的意思是跨站請求偽造,其實最簡單的理解我們可以這么講,假如一個微博關注用戶的一個功能,存在CSRF漏洞,那么此時黑客只需要偽造一個頁面讓受害者間接或者直接觸發,然后這個惡意頁面就可以使用受害者的微博權限去關注其他的人微博賬戶。CSRF只要被批量化利用起來其危害還是比較大的。

舉個例子,比如筆者在新浪首頁執行了一次搜索請求。

 

 

可以看到這里有個Referer的信息,Referer也就是請求來源地址,也就是說這個請求是從http://www.sina.com.cn這里發起的。然后去掉Referer,去執行這個請求,發現這個請求仍然可以進行正常的搜索,那么就說明這個請求沒有判斷請求來源也就是Referer,在請求頭部也沒有發現存在token的跡象,那么筆者可以判斷此處存在CSRF,這個CSRF是沒有任何危害的,但是換成其他請求呢?比如加關注,修改資料或者其他敏感操作呢?

 

0x02 CSRF漏洞成因及分類

1)第一種

請求直接是個GET請求,然后請求中沒有token驗證參數,然后還有一個固定的變量可以被控制。這種是比較常見的一種CSRF漏洞。這種漏洞的檢測方法很簡單:網頁操作某功能,抓包后,如果發現滿足上面條件,然后再去頁面測試下,基本就可以確定存在不存在CSRF漏洞了。

實例

某微博站曾存在的一個漏洞,關注用戶微博的請求如下(其中key的值是每一個用戶獨有唯一的):

1
http://***.****.com/reflow/follow?resType=json&isAjax=1&key=226216966

筆者根據上面的測試方法進行測試發現無token,但是對referer做了校驗,但是csrf的情況還是存在的,因為被攻擊者的referer往往是和CSRF漏洞的GET請求是同域的,所以除非驗證的相當的嚴格,一般情況下的驗證是無效的,此類的站點輸入微博類的站點,用戶可以隨隨便便在上面發送微博,微博中可以帶上該鏈接,只要受害者點擊即可關注黑客的微博了。

 

2)第二種

請求是個POST請求,post請求中沒有token參數,然后請求也沒有驗證referer信息。這種是存在CSRF情況最多的一種。這種漏洞的檢測方法也很簡單:網頁操作某功能,抓包后,如果發現沒有token等參數,然后就將referer信息設置為空,再次發包請求,如果請求成功了,就說明這里有CSRF漏洞。

如果有token等參數,可以嘗試將token去掉,然后再將referer也去掉,進行驗證。這種CSRF漏洞的利用,是需要在自己服務器構造一個form表單的,然后將服務器form表單的URL作為CSRF攻擊進行利用的,或者用js代碼生成form表單,或者用ajax實現。

實例

某微博主頁刷粉絲,利用poc如下:

1
2
3
4
5
6
7
8
9
10
< html >
     < body >
         < form name = "px" method = "post" action = "http://widget.******.com/plugin/followbutton/addfans" >
             < input type = "text" name = "page_id" value = "60185****" >
         </ form >
         < script >
          document.px.submit();
          </ script >
      </ body >
  </ html >

 

3)第三種

請求是POST,post請求中沒有token參數,但是驗證了referer信息。然而可以將post請求改寫為get請求,然后通過第一種情況下的那個方法利用。這種的檢測方法,就是先執行了第二種的驗證后,發現有對CSRF進行防御。然后將post請求改寫為GET請求,發現仍然可以成功執行。漏洞成因是因為服務器端接收請求參數的時候,沒有嚴格的用$_POST 而是用的類似於 $_REQUEST這種post,get請求的參數都可以接收的寫法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM