在这个级此外CSRF裂痕中,处事端多了一句eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ]校验,ereg()函数是模式匹配,通过超全局数组获取了哀求头referer值(也就是会见者向host提倡哀求时地址的页面)和host值,而且搜查host的值是否在referer中呈现。按照势力巨子
(https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name),这两个值无法以编程的方法修改,抓包除外,由于在csrf中无法通过抓取客户端的包举办修改,以是按理来说是安详的。实则否则,通过公网处事器,诱使victim会见名字包括host的html文件就可以实现绕过。
(3) High level
- <?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 = 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>";
- }
-
- mysql_close();
- }
-
- // Generate Anti-CSRF token
- generateSessionToken();
-
- ?>
在高级别中的代码,首要是行使了Anti-csrf机制,用户每次会见改密页面时,处事器会返回一个随机的token,向处事器提倡哀求时,必要提交token参数,而处事器在收到哀求时,会优先搜查token,只有token正确,才会处理赏罚客户端的哀求。我们可以按F12来看看这个token:

可以看到差异的用户会返回一个差异的token,这个token在hidden栏内里,这样一来,迫于同源计策,进攻者无法获取victim的token,也就无法实现CSRF进攻。可是真的无法实现吗?共同xss我们照旧可以偷取token的,可是这难度无疑增大,我们必必要有处事器的一个xss裂痕来偷取token,然后再行使CSRF。进攻本钱也增大。
(4) Impossible level
- <?php
-
- if( isset( $_GET[ 'Change' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
-
- // Get input
- $pass_curr = $_GET[ 'password_current' ];
- $pass_new = $_GET[ 'password_new' ];
- $pass_conf = $_GET[ 'password_conf' ];
-
- // Sanitise current password input
- $pass_curr = stripslashes( $pass_curr );
- $pass_curr = mysql_real_escape_string( $pass_curr );
- $pass_curr = md5( $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();
-
- // Do both new passwords match and does the current password match the user?
- if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
- // It does!
- $pass_new = stripslashes( $pass_new );
- $pass_new = mysql_real_escape_string( $pass_new );
- $pass_new = md5( $pass_new );
-
- // Update database with new password
- $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
- $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
- $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
- $data->execute();
-
- // Feedback for the user
- echo "<pre>Password Changed.</pre>";
- }
- else {
- // Issue with passwords matching
- echo "<pre>Passwords did not match or current password incorrect.</pre>";
- }
- }
-
- // Generate Anti-CSRF token
- generateSessionToken();
-
- ?>
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|