something about DVWA - CSRF
DVWA
CSRF(跨站请求伪造)
跨站请求伪造(Cross-site request forgery
),也被称作one-click attack
。
用来挟持用户在当前已登录的Web应用程序上执行非本意的操作。
CSRF访问原理:
Low
手工测试
直接在已经登录成功,身份认证未失效的浏览器上访问以下url即可更改当前用户的密码。
1
http://train.com/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#
源码分析
直接从
request
中获取参数1
2
3// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];新密码与确认密码相同即更新数据库
使用
mysqli_real_escape_string
函数转义特殊字符,防止sql注入。 然后将密码使用md5
加密后入库。1
2
3# 转义特殊字符
$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 );
Medium
手工测试
与
Low
级别相同。不同的是构造的http请求需要包含
Referer
字段,用来验证url来源。1
Referer: http://train.com/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change
源码分析
判断请求来源页面是否为本系统页面。
1
2
3
4// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
//...
}其它与
Low
级别相同。
High
手工测试
与
Medium
级别相同。不同的是构造的http请求需要包含页面上隐藏的
token
参数。(与XSS配合)1
http://train.com/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change&user_token=253d1f2fad7d8c82627b1c356102ad4b#
源码分析
使用
token
验证身份1
2// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );其它与
Low
级别相同。最后重新生成
token
1
2// Generate Anti-CSRF token
generateSessionToken();
Impossible
源码分析
使用
token
验证身份与
High
级别相同。验证当前用户存在
验证当前用户当前密码是否正确。
1
2
3
4
5// 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();其它与
High
相同。