跨站请求伪造

​ CSRF,全称(Cross Site Request Forgery 跨站请求伪造),是一种对网站的恶意利用,主要通过利用受害者尚未失效的身份认证信息(cookies,session等),诱骗其点击恶意的链接或者访问包含攻击代码的页面,进而达到非法操作的目的(比如转账,修改密码等。)

​ 新手很容易把XSS攻击(跨站脚本攻击),和CSRF(跨站请求伪造)两者相混。其实可以依靠,前者需要盗取用户的cookie,而后者直接利用cookie的特点对其进行区分。以下是基于DVWA的靶向环境对CSRF有一个全面的认识。

Security Level:low

1

​ 进入发现是一个修改密码的页面,输入密码点击change后,发现输入的数据在URL地址栏上都有回显。所以,我们可以了解到,当浏览器转到该地址的时候,密码就会发生变化。这里我们就用到了cookie的知识:当用户在浏览器登录网站后,会在本地终端存放一个加密的数据(cookie),这样会便于网站从服务器中调取相应的页面,同时减少服务器的负担。

​ 那么我们就可以利用用户的cookie来向服务器发送伪造的请求,注意,如果用户在谷歌浏览器进行访问时,cookie只对谷歌浏览器产生作用,如果用搜狗浏览器是无法跳过登陆的。下一步就是让用户在毫不知情的情况下去打开这个链接,方法很多,我们主要介绍的是写html的方式。

1
2
3
<img src="http://127.0.0.1/dvWA/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change#"
border="0" style="dispaly:none;"/>
<h1>404 NOT FOUND!</h1>

​ 当用户点击这串链接,浏览器就会访问并解析误认为是图片的地址,间接的完成了对密码的修改。一般来说,用户是很难去点击一个陌生的网址,但是我们可以将网址伪装成一个简单的二维码,或者利用短链接来隐藏URL,接着就是利用一些简单的手段诱惑用户进行操作。(这也是黑客电影中常见的桥段之一)

最后,放上服务器的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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();
}
?>

​ 低难度的CSRF不存在任何的防护措施,这里主要是对CSRF(跨站请求伪造)有一个基本的认识,以后,还会根据DVWA环境下对跨站请求伪造的防护机制做一个介绍。

Author: De-m0n
Link: http://De-m0n.github.io/2019/08/19/CSRF/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶
Catalog