加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

浅谈PHP安全规范

发布时间:2018-10-15 10:42:58 所属栏目:评论 来源:littlepotato
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市

在这个级别的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

  1. <?php  
  2.  
  3. if( isset( $_GET[ 'Change' ] ) ) {  
  4.     // Check Anti-CSRF token  
  5.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  6.  
  7.     // Get input  
  8.     $pass_new  = $_GET[ 'password_new' ];  
  9.     $pass_conf = $_GET[ 'password_conf' ];  
  10.  
  11.     // Do the passwords match?  
  12.     if( $pass_new == $pass_conf ) {  
  13.         // They do!  
  14.         $pass_new = mysql_real_escape_string( $pass_new );  
  15.         $pass_new = md5( $pass_new );  
  16.  
  17.         // Update the database  
  18.         $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";  
  19.         $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );  
  20.  
  21.         // Feedback for the user  
  22.         echo "<pre>Password Changed.</pre>";  
  23.     }  
  24.     else {  
  25.         // Issue with passwords matching  
  26.         echo "<pre>Passwords did not match.</pre>";  
  27.     }  
  28.  
  29.     mysql_close();  
  30. }  
  31.  
  32. // Generate Anti-CSRF token  
  33. generateSessionToken();  
  34.  
  35. ?> 

在高级别中的代码,主要是使用了Anti-csrf机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。我们可以按F12来看看这个token:

浅谈PHP安全规范

可以看到不同的用户会返回一个不同的token,这个token在hidden栏里面,这样一来,迫于同源策略,攻击者无法获取victim的token,也就无法实现CSRF攻击。但是真的无法实现吗?配合xss我们还是可以盗取token的,但是这难度无疑增大,我们必须要有服务器的一个xss漏洞来盗取token,然后再使用CSRF。攻击成本也增大。

(4) Impossible level

  1. <?php  
  2.  
  3. if( isset( $_GET[ 'Change' ] ) ) {  
  4.     // Check Anti-CSRF token  
  5.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  6.  
  7.     // Get input  
  8.     $pass_curr = $_GET[ 'password_current' ];  
  9.     $pass_new  = $_GET[ 'password_new' ];  
  10.     $pass_conf = $_GET[ 'password_conf' ];  
  11.  
  12.     // Sanitise current password input  
  13.     $pass_curr = stripslashes( $pass_curr );  
  14.     $pass_curr = mysql_real_escape_string( $pass_curr );  
  15.     $pass_curr = md5( $pass_curr );  
  16.  
  17.     // Check that the current password is correct  
  18.     $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );  
  19.     $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );  
  20.     $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );  
  21.     $data->execute();  
  22.  
  23.     // Do both new passwords match and does the current password match the user?  
  24.     if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {  
  25.         // It does!  
  26.         $pass_new = stripslashes( $pass_new );  
  27.         $pass_new = mysql_real_escape_string( $pass_new );  
  28.         $pass_new = md5( $pass_new );  
  29.  
  30.         // Update database with new password  
  31.         $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );  
  32.         $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );  
  33.         $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );  
  34.         $data->execute();  
  35.  
  36.         // Feedback for the user  
  37.         echo "<pre>Password Changed.</pre>";  
  38.     }  
  39.     else {  
  40.         // Issue with passwords matching  
  41.         echo "<pre>Passwords did not match or current password incorrect.</pre>";  
  42.     }  
  43. }  
  44.  
  45. // Generate Anti-CSRF token  
  46. generateSessionToken();  
  47.  
  48. ?> 

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读