CSRF漏洞利用以及防御手段(详细解释)
Posted Le叶a子f
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF漏洞利用以及防御手段(详细解释)相关的知识,希望对你有一定的参考价值。
基础知识
靶场实验(DVWA)
DVWA security: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 = ((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);
}
?>
发现源码对csrf漏洞没有进行防御,输入一次新密码然后再确认一次就可以改密码。
那么我们现在模拟攻击者的视角,将内容填写,并且抓包
发现这里是使用GET请求进行传递变量的,所以第一种攻击手段就是可以发送url给受害者,但是如果直接发送下面这个链接会太过于明显
http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
可以利用短地址进行伪装,这里可以百度搜索百度短地址
http://af0.cn/GzPRv
然后我们现在模拟受害者点击这个恶意地址
发现受害者的密码被成功修改了,但是这种方法可以看出,受害者也可以发现自己的密码被进行了修改,所以介绍下面一种方法,隐蔽性更强。
把构造好的html页面放到公网上。
诱导受害者访问这个html页面,这个页面也可以添加元素修改为中奖页面,并且访问后跳转到其他页面,隐蔽性更强
后面就不再详细列出实验步骤,主要说明防御手段和绕过手段
DVWA security:medium
<?php
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
}
其余部分和上面一样
?>
防御手段:验证Referer
$_SERVER['HTTP_REFERER']:PHP中获取链接到当前页面的前一页面的url链接地址,即HTTP数据包中的Referer参数的值。
$_SERVER['SERVER_NAME']:PHP中获取服务器主机的名称,即HTTP数据包中的Host参数的值。
可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME
如果使用上面的手段不进行绕过的化,['HTTP_REFERER']的值是“攻击者构造的html的地址”['SERVER_NAME']的值是“受害者的主机名称”,所以可以得知攻击者和受害者肯定不是同局域网下的。
那么如果想通过上面的防御措施,首先我们是无法修改受害者的主机名称的,但是我们可以将构造的html文件的名字改为“受害者的主机.html”,这样受害者的主机就被包括在referer中了
DVWA security:medium
添加随机token值,并验证
查看源码
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' )
发现代码中多了这一段内容,这就是验证用户的token。
High 的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
以上是关于CSRF漏洞利用以及防御手段(详细解释)的主要内容,如果未能解决你的问题,请参考以下文章