4.1 身份认证
CRSF攻击,就像我刚才说的这个例子一样,利用了网站用于对请求进行身份认证的进程的缺陷。当你访问一个需要登录(通常是以用户名口令方式登录)的网站时,该网站一般要对你进行身份认证。然后该网站会在浏览器中存储你的身份认证信息,以便于你在访问该网站的新网页时不用每次都再去登录。有两种存储身份认证信息的方式:使用基础身份认证协议或cookie。
当HTTP请求中包含形如Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l的信息头时,该网站采用了基础身份认证协议。上面看起来随机的字符串是以冒号进行分隔的用户名和口令的base64编码。在本例中,QWxhZGRpbjpPcGVuU2VzYW1l将被解码为Aladdin:OpenSesame。本章中我们不会聚焦于基础身份认证,但是你在本章中学到的很多技术都可以用于挖掘采用基础身份认证而导致的CSRF漏洞利用上。
cookie是由网站创建并存储在用户端浏览器中的小文件。网站使用cookie有很多目的,例如存储用户的爱好或者用户访问网站的历史记录等。cookie具有特定的被标准化为信息片的属性。这些属性告知浏览器cookie是做什么的,以及该如何处理它们。有些cookie属性可能会包含domain、expires、max-age、secure和httponly等,在本章后面你将会学到这些。除了属性之外,cookie也可能会包含一个名/值对,由一个标识符及其相关联的要发往网站(cookie的domain属性定义了信息要发往的网站)的数值构成。
浏览器定义网站能够设置的cookie的数量。但是一般来说,单个网站能够在通用浏览器中设置50~150个cookie,据报道,在有些浏览器中可以设置多达600个以上的cookie。浏览器通常允许网站使用每个cookie最大4KB的存储空间。cookie的名和值没有标准,也就是说,网站可以自由地选择自己的名/值对及其目的地址。例如,网站可以选择命名为sessionId的名字,以便于记住用户是谁,而不用在用户访问每个网页或进行每次操作时都要求他们重新输入用户名和口令。(正如在第1章所描述的那样,HTTP请求是无状态的。无状态意味着网站并不知道每次HTTP请求对应的用户是谁,因此,它必须对每次请求都重新进行用户认证。)
作为一个例子,cookie中的名/值对可能是sessionId=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08,并且cookie具有一个.site.com域。因此,sessionId cookie将被发送到用户访问的每个.<site>.com网站,例如,foo.<site>.com、bar.<site>.com、www.<site>.com等。
secure和httponly属性告诉浏览器什么时候和怎样发送和读取cookie。这些属性不包含取值,而是表示了在cookie中是否出现的标志。当cookie中包含secure属性时,浏览器将只在访问HTTPS网站时发送cookie。例如,如果你带着一个secure cookie访问http://www.<site>.com/(一个HTTP网站),你的浏览器将不会发送cookie到这个网站。原因就是为了保护你的个人隐私,因为HTTPS连接是加密的,而HTTP连接是不加密的。httponly属性,当你在第7章学习跨站脚本攻击时会觉得它非常重要,它会告诉浏览器只能通过HTTP或者HTTPS请求来读取cookie。因此,浏览器不允许任何脚本语言,例如JavaScript,来读取cookie的值。当cookie中没有设置secure和httponly属性时,这些cookie将被正常发送并且可能会被恶意读取。没有设置secure属性的cookie可能被发送到一个非HTTPS网站;同样地,没有设置httponly属性的cookie可能被JavaScript脚本读取。
expires和max-age属性表示cookie什么时候过期并被浏览器删除。expires属性简单地告诉浏览器在一个确定的时间删除cookie。例如,cookie可以设置该属性为expires=Wed,18 Dec 2019 12:00:00 UTC(世界时间:2019年12月18日,星期三)。对应地,max-age属性是直到cookie超时的秒数,并以一个整数(max-age=300)的形式体现。
总之,如果Bob访问的网银使用了cookie,那么网银将会存储他的身份认证信息以支持后续的处理过程。一旦Bob访问了网银并进行了登录,银行将会以一个HTTP响应回应他的HTTP请求,在该响应消息中包含了标识Bob身份的cookie。反过来,Bob的浏览器将会在向该银行网站发起其他HTTP请求时自动地发送cookie信息。
当查询完他的账号余额后,Bob离开银行网站时并没有退出登录。注意这个细节,因为当你退出登录一个网站时,网站一般会向浏览器发出一个HTTP响应消息,要求其删除cookie。因此,当你再访问这个网站时,你将要重新进行登录。
当Bob收取邮件并点击了指向未知网站的链接后,他无意中访问了一个恶意的网站。这个恶意网站被设计为通过引导Bob的浏览器发起一个到他的银行网站的请求而执行一个CSRF攻击。该请求将同时发送Bob浏览器中的cookie信息。