什么是CSRF攻击?CSRF攻击相对于XSS攻击来说比较难以理解。从攻击视角来看,主要流程就是攻击者伪造一个页面,页面功能为伪造当前用户的请求。
当用户点击恶意页面时,会自动向当前用户的服务器提交攻击者伪造的业务请求。这个攻击者伪造的请求实际是由用户的身份发起,因此请求时会以当前用户的身份进行执行。总体来说,CSRF攻击的效果是在当前用户不知情的情况下,以当前用户的身份发送业务请求并执行。
下面来看一个例子。首先创建一个测试环境,用来模拟用户的日常Web应用过程。测试环境首先要求用户进行登录,登录成功后可看到网站推荐功能,用户可填写下面的内容并发表推荐,推荐次数最多的站点会在页面的右边显示。
先以当前正常用户身份登录页面,参见图1。
图1 演示环境登录页面
当用户成功登录后,会进入内容提交页面,用户可在该页面输入用户名称、标题、留言信息等,并点击提交按钮向服务器发送本次请求。提交成功后可看到当前留言板的内容。效果如图2所示。
图2 正常功能效果
这里以正常用户身份提交一条留言,并抓取用户的HTTP请求包,可看到当前页面利用表单形式来提交内容。正常提交的内容及当前HTTP请求包如图3所示。
图3 正常留言效果
可以看到当前页面利用POST方式向后台发起的请求。其中,用户提交的标题对应参数input1,推荐站点对应参数input2,推荐理由对应参数input。服务器接收到内容后会将内容首先保存到数据库,之后在页面展示出来。
当攻击者要伪造当前用户身份并提交一条留言,主要流程如下:首先,攻击者伪造一个页面,在页面中采用一些诱导行为,诱使当前用户点击以实现触发,这样就形成了一次有效的CSRF攻击。
攻击者需先构造一段可执行的语句,并诱导用户点击。这里构造一个第三方页面。此页面看起来就是进行图片浏览,多数用户会根据页面提示点击观看图片(实际情况下会采取更有效的诱导方式,如构造更好看、更逼真的页面等,这里仅作示例)。但此页面实际的源码如下:
当用户登录系统,访问攻击者这个页面,并点击此页面的“View my Pictures!”时,会自动访问本地的连接(由于测试环境为本地,实际情况下添加需访问的链接即可)。如果当前用户处于登录状态,则访问的链接恰好就是添加一个留言。漏洞执行效果如图4所示。
图4 伪造页面显示效果
这里可以看到,当用户在登录时点击攻击者的诱导页面,即可在用户不知情的情况下以当前用户身份添加一个留言,留言内容即为攻击者构造的诱导页面中预制的内容。这个过程就是一个标准的CSRF攻击流程。当然,在诱导用户点击链接时还可以采用其他更隐蔽的方式来提升用户点击的成功率。
观察上述的漏洞基本利用流程可发现,想要攻击形成有效的CSRF攻击必须满足三个条件:
1)用户处于登录状态。
2)伪造的链接与正常应用请求链接一致。
3)后台未对用户业务开展合法性做校验。
只有三个要素同时存在,则漏洞方可利用成功,尤其需要注意的是,用户必须在登录状态时点击伪造的页面。上例利用的是POST方式发起的业务请求,相对于POST方式发起请求,在GET方式下,由于所有参数均在URL中进行传输,因此CSRF攻击链接构造上比POST方式简单一些,但本质都是伪造用户的请求。下例就是一个利用GET方式构造的页面:
将上例改成以POST方式传输,那么需构造的页面如下:
可以看到,POST请求方式的复杂之处在于需要创建一个隐藏表单,当用户访问时自动提交表单至目标连接,即可实现CSRF攻击。在CSRF漏洞利用场景中,GET方式与POST方式在漏洞利用效果方面没有区别,只是在构造页面方面POST稍显复杂。