什么是CSRF?

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。CSRF与XSS在攻击手段上有点类似,都是在客户端执行恶意代码,有些文章中认为CSRF与XSS的区别在于CSRF不注重于获取用户Cookie,但其实CSRF不仅可以在源站发起攻击,还可以引导用户访问其他危险网站的同时发起攻击。

CSRF原理

image.png

从上图可以看出,要完成一次CSRF攻击,受害者须依次完成两个步骤:

1、登录受信任网站A,并在本地生成Cookie;

2、在不登出A的情况下,访问危险网站B;

CSRF攻击是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。


实例

1、DVWA

在DVWA中的CSRF课程中,让我们修改用户名密码:

image.png

我们用burp抓包:

image.png

发现修改密码通过

GET/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change

就可以完成。当受害者点击了这个链接,他的密码就会被改成password(这种攻击显得有些拙劣,链接一眼就能看出来是改密码的,而且受害者点了链接之后看到这个页面就会知道自己的密码被篡改了)。

有人会说,这个链接也太明显了吧,不会有人点的,没错,所以真正攻击场景下,我们需要对链接做一些处理。

(1)通过短链接的方式:

image.png

这样就可以生成http://dvwa.com/xxx的短地址,这样就隐蔽了很多。


(2)burp生成攻击页面

在Burpsuite中有一个用于实现检测CSRF漏洞的功能,在对Request包右键>Engagement tools>Generate CSRF PoC,其会自动生成一个HTML文件:

image.png

image.png

我们将页面内容拷贝到1.html文件中:

image.png

点击一下submit request 就可以修改密码了。

image.png

我们来看一下具体出问题的代码:

image.png

可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现)。


2、74CMS

74cms_v4.1.9后台添加管理员时存在CSRF漏洞,管理员会登录后,进入到【系统】-【网络管理员】-【添加管理员】中,进行添加管理员。

image.png

进行抓包:

image.png

利用burp生成csrf POC:

image.png

我们将页面内容拷贝到1.html文件中:

image.png

点击 submit request

image.png

我们发现test管理员已经成功添加。


CSRF的防御

1. 关键操作只接受POST请求;

2.添加验证码操作,增加与用户的互动,即便是最简陋的验证码也能起到很好的效果;

3.检测referer ,此方法不推荐,因为很多时候根本就没有refer头,根据不同的浏览器,网站情况不同;

4.Token 主流防御方法,可以使用cookie或者session进行构造。当然这个token仅仅只是针对CSRF攻击,在这前提需要解决好XSS攻击,否则这里也将会是白忙一场(XSS可以偷取客户端的cookie);

5.CSRF成功的条件在于攻击者能够预测所有的参数构造出合法的请求,可以对参数进行加密,防止CSRF。

6.Token是一次性的,每次成功后都更新Token

源链接

Hacking more

...