溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DVWA下的CSRF通關(guān)是怎樣的

發(fā)布時(shí)間:2021-12-16 18:12:23 來(lái)源:億速云 閱讀:121 作者:柒染 欄目:網(wǎng)絡(luò)管理

DVWA下的CSRF通關(guān)是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

CSRF跨站點(diǎn)請(qǐng)求偽造(Cross—Site Request Forgery):

跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來(lái)理解:
攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求,對(duì)服務(wù)器來(lái)說(shuō)這個(gè)請(qǐng)求是完全合法的,但是卻完成了攻擊者所期望的一個(gè)操作,比如以你的名義發(fā)送郵件、發(fā)消息,盜取你的賬號(hào),添加系統(tǒng)管理員,甚至于購(gòu)買商品、虛擬貨幣轉(zhuǎn)賬等。 如下:其中Web A為存在CSRF漏洞的網(wǎng)站,Web B為攻擊者構(gòu)建的惡意網(wǎng)站,User C為Web A網(wǎng)站的合法用戶。

CSRF攻擊攻擊原理及過(guò)程如下:

1. 用戶C打開(kāi)瀏覽器,訪問(wèn)受信任網(wǎng)站A,輸入用戶名和密碼請(qǐng)求登錄網(wǎng)站A;

2.在用戶信息通過(guò)驗(yàn)證后,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器,此時(shí)用戶登錄網(wǎng)站A成功,可以正常發(fā)送請(qǐng)求到網(wǎng)站A;

3. 用戶未退出網(wǎng)站A之前,在同一瀏覽器中,打開(kāi)一個(gè)TAB頁(yè)訪問(wèn)網(wǎng)站B;

4. 網(wǎng)站B接收到用戶請(qǐng)求后,返回一些攻擊性代碼,并發(fā)出一個(gè)請(qǐng)求要求訪問(wèn)第三方站點(diǎn)A;

5.  瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站 B 的請(qǐng)求,在用戶不知情的情況下攜帶 Cookie 信息,向網(wǎng)站 A 發(fā)出請(qǐng)求。網(wǎng)站 A 并不知道該請(qǐng)求其實(shí)是由 B 發(fā)起的,所以會(huì)根據(jù)用戶 C 的 Cookie 信息以 C 的權(quán)限處理該請(qǐng)求,導(dǎo)致來(lái)自網(wǎng)站 B 的惡意代碼被執(zhí)行。

與XSS的區(qū)別:

XSS是通過(guò)修改頁(yè)面Javascript等代碼后,發(fā)給用戶從而實(shí)現(xiàn)盜取cookie信息,之后利用cookie進(jìn)行登陸網(wǎng)站等操作。非法操作是黑客。
CSRF并沒(méi)有盜取cookie信息,而是通過(guò)用戶直接利用cookie進(jìn)行操作。非法操作并不是黑客,而是用戶本身。

1、low級(jí)別

<?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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

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

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

可以看到,源碼中的mysql_real_escape_string() 函數(shù)有防護(hù)sql注入的作用,然后就只進(jìn)行了$pass_new == $pass_conf判斷,沒(méi)有進(jìn)行任何的驗(yàn)證。

在新密碼和確認(rèn)密碼之處填寫(xiě)123456

DVWA下的CSRF通關(guān)是怎樣的

burp suite抓包發(fā)現(xiàn),通過(guò)get請(qǐng)求執(zhí)行

DVWA下的CSRF通關(guān)是怎樣的

http://172.21.98.85/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

根據(jù)上面的url,進(jìn)行構(gòu)造payload:

http://172.21.98.85/DVWA-master/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change#

這樣的payload,一般人都可以看出來(lái)存在陷進(jìn),往往不會(huì)去點(diǎn)擊,因此我們還需要進(jìn)一步偽裝,把它縮短。

DVWA下的CSRF通關(guān)是怎樣的

DVWA下的CSRF通關(guān)是怎樣的

得到一個(gè)短的url:http://r6d.cn/9rGy,提醒一句,以后但凡看見(jiàn)很短的url,然后以很不常見(jiàn)的格式出現(xiàn),千萬(wàn)別著急點(diǎn)擊瀏覽。

DVWA下的CSRF通關(guān)是怎樣的

現(xiàn)在的密碼已經(jīng)變成test,不再是123456。

我們還可以編輯一個(gè)頁(yè)面,填好payload,等正常用戶瀏覽訪問(wèn)就執(zhí)行了。

DVWA下的CSRF通關(guān)是怎樣的

后綴改成.html.就行了。

DVWA下的CSRF通關(guān)是怎樣的

真實(shí)情況下,這個(gè)html文件的表象應(yīng)該具備各種誘惑力,例如,如何一夜暴富、xxx照等等,讓你情不自禁的想去瀏覽訪問(wèn)。

DVWA下的CSRF通關(guān)是怎樣的

正當(dāng)你想開(kāi)噴時(shí),說(shuō)好的驚喜呢,怎么是404,哈哈,但其實(shí)你已經(jīng)將你的密碼從test修改為password了。

DVWA下的CSRF通關(guān)是怎樣的

2、medium

<?php

if( isset( $_GET[ 'Change' ] ) ) {
// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
// 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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

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

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

先看看里面幾個(gè)重要的函數(shù)

eregi()函數(shù): 匹配符合條件的字符串,已經(jīng)被preg_match() 替代,加i不區(qū)分大小寫(xiě)。
stripos函數(shù):返回字符串在另一字符串中第一次出現(xiàn)的位置,如果沒(méi)有找到字符串則返回 FALSE。
$_SERVER['HTTP_REFERER'] #鏈接到當(dāng)前頁(yè)面的前一頁(yè)面的 URL 地址。
$_SERVER['SERVER_NAME'] #當(dāng)前運(yùn)行腳本所在服務(wù)器主機(jī)的名稱。

同樣的內(nèi)容,換成1.html

DVWA下的CSRF通關(guān)是怎樣的

DVWA下的CSRF通關(guān)是怎樣的

DVWA下的CSRF通關(guān)是怎樣的

但是實(shí)際上沒(méi)修改完成,因?yàn)檫@個(gè)級(jí)別的增加了Referer認(rèn)證,那么將http包頭的Referer參數(shù)的值中包含主機(jī)名就行了。

3、High級(jí)別

先放棄,這個(gè)token值我一直繞不過(guò)去,表示先放棄了,大概繞過(guò)的思路知道就行,不求甚解!

4、mpossible級(jí)別

<?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 
echo "<pre>Password Changed.</pre>"; 

else { 
// Issue with passwords matching 
echo "<pre>Passwords did not match or current password incorrect.</pre>"; 



// Generate Anti-CSRF token 
generateSessionToken(); 

?>

也是采用PDO技術(shù)防護(hù)了,根據(jù)現(xiàn)實(shí)情況,一般防護(hù)csrf的辦法最常見(jiàn)的就是增加原始密碼驗(yàn)證,短信驗(yàn)證、驗(yàn)證碼驗(yàn)證,這樣基本就很難進(jìn)行scrf攻擊了。

看完上述內(nèi)容,你們掌握DVWA下的CSRF通關(guān)是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)
推薦閱讀:
  1. dvwa使用
  2. CI的CSRF的改造

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI