一、原理
CSRF(Cross-site request forgery)跨站请求伪造。当受害者在与目标网站保持一个会话连接的时候,这时黑客构造了一个可以执行在目标网站相关操作(如修改密码、转账)的URL发送给受害者,受害者点击之后执行了此操作。需要注意的就是受害者必须与目标网站保持连接,这是点击链接之后才会执行操作。
二、DVWA靶机实验
Low级别
打开页面显示修改密码,需要输入新密码然后确定,当点击提交之后查看URL,显示了GET方式提交
此时如果黑客事先下载并研究了这个流程之后,可以构造一条URLhttp://192.168.1.4/vulnerabilities/csrf/?password_new=abc&password_conf=abc&Change=Change#
原始用户为1337密码为charley然后发送给1337用户,当点击后显示页面
说明密码已经修改。这时退出登陆,通过原密码已经无法登陆,通过abc可以登陆
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
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>";
}
mysql_close();
}
?>
查看后台源代码
通过使用eregi()函数增加了一层检查,此函数的作用就是在$_SERVER[ 'HTTP_REFERER' ] (引导用户代理到当前页的前一页的地址)
中检查是否含有$_SERVER[ 'SERVER_NAME' ](当前运行脚本所在的服务器的主机名。)
,在这个环境下,后者即为192.168.1.4
即在http包中referer参数中查找host的参数
此时需要准备一台服务器,然后在服务器中创建一个名为HOST的html文件,这时在refer中去检索是否含有host的时候检索到html文件名时就会通过从而导致csrf
首先查看现在
我在vmware win7的网站根目录下创建一个文件,192.168.1.4.html,内容为:
<img src=http://192.168.1.4/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change# >
,然后构造URL,http://192.168.216.130/192.168.1.4.html 此时,这段URL即为refer,DVWA会在这段URL中查找是否含有192.168.1.4,由于文件名为192.168.1.4所以会通过检查
在访问这段URL之前,先查看下密码(password)
然后访问链接之后,再通过password来进行登陆已经无法登陆,尝试admin来登陆,成功登陆
说明已经产生了csrf的攻击
标签的使用
<a>
标签
<iframe>
标签
<img>
标签
CSS层叠样式表中background:url(csrf的URL)
三、防御
1、验证码进行验证(二次验证)
2、referer check
3、anti csrf token
检测token的原理:
一般在敏感操作的时候比如修改个人信息的场景,后台程序会随机给用户当前的操作发送一个token,然后当用户提交表单的时候会将token一起发送给后台程序,此时后台程序对讲用户发来的token和后台存储的token值进行比较,如果相同则为合法操作,不同则为非法操作。
token的泄露:
①GET型泄漏:页面包含<img src="URL">
时,referer中会携带token
②POST型泄漏:当网站存在XSS漏洞时,如果token包含在cookie中会通过XSS获取token从而获得用户的token。