CSRF
跨站请求伪造,由客户端发起,是一种劫持受信任用户向服务器发送非预期请求的攻击方式
一、Low等级
1、漏洞分析
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
- 没有任何防护CSRF的机制
2、漏洞利用
- 构造链接
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=abc123&password_conf=abc123&Change=Change
- 构造攻击页面、打开页面即攻击
<html>
<img src="http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=abc123&password_conf=abc123&Change=Change">
<h1>404</h1>
<h2>File not found.Please refresh.</h2>
</html>
二、Mediium等级
1、漏洞分析
// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
- 验证请求的HTTP头中的referer中是否含有Server_name,即是否含有服务器Host
2、漏洞利用
- 获取服务器host内容
- 将伪造的html页面命名为host内容
- 绕过判断,成功攻击
三、High等级
1、漏洞分析
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
- 修改密码需要加入上次访问页面返回的token
2、漏洞利用
2.1结合xss
- 利用XSS获取token
- 使用获取的token,构造和Low等级类似的攻击页面
- 成功攻击
2.2结合文件上传
- 构造链接
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change&user_token=user_token
- 构造页面,向修改密码页面发送请求,利用jsp的函数获取token
- 利用文件上传漏洞,将伪造页面放在与修改密码页面同一域名下
- 成功攻击
四、Impossible等级
1、安全分析
// Sanitise current password input
$pass_curr = stripslashes( $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();
- 加入原始密码验证,有效防止cerf攻击
- 采用PDO机制,防止SQL注入