4.2 通过GET请求发起CSRF攻击
恶意网站利用Bob网银的方式取决于银行是通过GET请求还是通过POST请求接受转账申请的。如果Bob的网银接受通过GET请求进行转账,恶意网站就会发送具有隐藏表单或者<img>标签的HTTP请求。GET和POST方法都依赖于能够让浏览器发送需要的HTTP请求的HTML语法,并且两种方法都可以采用隐藏表单技术,但是只有GET方法可以使用<img>标签技术。在本节中,我们将研究一下当使用GET请求时如何使用HTML<img>标签技术来实现攻击,在4.3节中,我们再来研究隐藏表单技术。
攻击者需要在发送给鲍勃网银的HTTP转账请求中包含Bob的cookie信息。但是因为攻击者没有办法读取到Bob的cookie,所以他不能只是简单地生成一个HTTP请求并发送给Bob的网银。相反,攻击者可以使用HTML的<img>标签来精心生成一个包含Bob cookie的GET请求。<img>标签对网页上的图像进行渲染,并且包含一个用来告诉浏览器去哪里定位图像文件的src属性。当浏览器渲染<img>标签时,它会向标签的src属性发起一个包含任何已有的cookie的HTTP GET请求。因此,假定恶意网站使用类似如下从Bob的账号转账500美元到Joe的账号的URL:
那么恶意<img>标签将使用这个URL作为它的资源值,如下所示:
结果是,当Bob访问攻击者控制的网站时,网站会在其HTTP响应中包含上面的<img>标签,从而浏览器会进一步发起向银行的HTTP GET请求。浏览器发送Bob的身份认证信息以获取其认为的对应图片的相关资源信息。但是实际上,银行接收到了这个请求,处理了URL中的<img>标签的src属性,生成了转账申请。
为了避免该漏洞,开发者应该永不使用HTTP GET请求去执行任何后续的数据修改申请,例如转账资金。但是,任何具有只读属性的请求都应该是安全的。许多用于创建网站的通用网站框架,例如Ruby On Rails、Django等,都假定开发者遵循这一准则,因此它们都自动地在POST请求而不是GET请求中增加CSRF防护手段。