DVWA之CSRF

CSRF:跨站請求僞造攻擊

SecurityLow 級別分析javascript

核心代碼html

 

輸入數據,以便Burp代理得到請求參數java

       

這裏能夠將第一行拿出來進行構造連接,瀏覽器

http://202.100.10.129/dvwa/vulnerabilities/brute/?username=111&password=111&Login HTTP/1.1服務器

或者利用burp編寫Poc,當咱們在Burp中抓到包後,點擊右鍵編寫Poccookie

   

 

當用戶觸發這個請求後,函數

 

密碼就會被修改爲111,固然,這樣子用戶能看到的話,用戶就知道了本身的密碼被修改,明顯很不現實。那麼如何在用戶不知情的狀況下進行修改密碼的攻擊呢?ui

咱們能夠採起構造攻擊頁面的方式:spa

在真實狀況下,這種方法須要事先在公網上上傳一個攻擊頁面,誘導用戶去訪問這個頁面,這樣才能在用戶不知情的狀況下進行攻擊。3d

沒有公網服務器的狀況下,能夠在本地環境假設這個攻擊頁面的服務器,這裏採用Kali做爲這個攻擊頁面的服務器。

 

啓動Apache服務

 

當用戶訪問到這個頁面後,會顯示不存在,通常狀況下,用戶都會選擇關掉這個頁面,沒有人去選擇查看源碼進行分析,這是不現實的,而此時用戶的密碼已經被咱們修改爲功,

 

當用戶退出後,下次再登陸的時候就會發現已經沒法登陸了。由於此時密碼已經被修改了。

 

SecurityMedium級別分析

核心代碼:

 

 

相關函數說明

int eregi(string pattern, string string)

檢查string中是否含有pattern(不區分大小寫),若是有返回True,反之False。

能夠看到,Medium級別的代碼檢查了保留變量 HTTP_REFERER(http包頭的Referer參數的值,表示來源地址)中是否包含SERVER_NAME(http包頭的Host參數,及要訪問的主機名,即202.100.10.129),但願經過這種機制抵禦CSRF攻擊

漏洞利用:

既然服務器進行了過濾,經過分析源代碼能夠獲得,它要求http包頭的Referer參數的值中必須包含主機名。

方法一:Burpsuite抓包進行修改後再提交給服務器

Ctrl+R發送到repeater,將主機名添加到Referer的後面

 

預覽能夠看到,密碼已經在用戶不知情的狀況下被修改

 

方法二:

將攻擊頁面名稱改成用戶主機名202.100.10.129.html (攻擊頁面放在攻擊者本身的服務器裏,202.100.10.130/202.100.10.129html),當用戶不當心點到這個頁面時,會自動執行如下腳本,用途就是更改密碼。

 

用戶通常看到404就會關掉,固然地址是能夠換成比較隱蔽的形式。

 

Burpsuite截到的包

 

SecurityHigh級別分析

核心代碼

 

能夠看到,該級別加入了Anti-CSRF token方法來防範CSRF攻擊,同時每次隨機生成一個token,當用戶提交的時候,服務器端會檢查token值是否正確,很好的起到了防範做用。很差攻破。不過照樣仍是能夠被利用,能夠發現High級別的反CSRF機制,最關鍵的地方就是要獲取token,利用受害者的cookie去修改密碼的頁面獲取關鍵的token。咱們能夠試着去構造一個攻擊頁面,將其放置在攻擊者的服務器,引誘受害者訪問,從而完成CSRF攻擊,下面是代碼。

<script type="text/javascript">

    function attack()

  {

   document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;

  document.getElementById("transfer").submit();

  }

</script>

<iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">

</iframe>

<body onload="attack()">

  <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf">

   <input type="hidden" name="password_new" value="password">

    <input type="hidden" name="password_conf" value="password">

   <input type="hidden" name="user_token" value="">

  <input type="hidden" name="Change" value="Change">

   </form>

</body>

當受害者不當心點擊這個頁面後,該網頁中的腳本會發生請求,偷偷去訪問修改密碼的頁面,獲取頁面的Token值,並向服務器發起修改密碼的請求。

PS:不過受到同源策略的限制,這種請求是沒法正常執行的。簡單來講,就是當用戶訪問被攻擊服務器A時,被默默的要求去請求B服務器上的攻擊腳本,這怎麼能夠,吃着本身碗裏的還想吃別人碗裏的,瀏覽器不容許這種行爲,除非別人主動從他碗裏給你夾肉過來。。。。。

故只有將攻擊頁面(將本身的肉放在別人的碗裏,不給你也得給你,皮一下,就是這麼個道理。)放在被攻擊者的服務器上,讓被攻擊服務器去請求位於本身服務器上的資源,這固然是沒有問題的了。

 

SecurityImpossible級別

核心代碼:

 

 

能夠看到, Impossible 級別的代碼利用PDO 技術防護SQL 注入,至於防禦CSRF ,則要求用戶輸入原始密碼(簡單粗暴),攻擊者在不知道原始密碼的狀況下,不管如何都沒法進行CSRF 攻擊。

注意:CSRF最關鍵的是利用受害者的cookie向服務器發送僞造請求,因此若是受害者以前用Chrome瀏覽器登陸的這個系統,而用搜狗瀏覽器點擊這個連接,攻擊是不會觸發的,由於搜狗瀏覽器並不能利用Chrome瀏覽器的cookie。

相關文章
相關標籤/搜索