尝试访问

http://mdsec.net/auth/395/

http://mdsec.net/auth/404/

img005  警告  一些应用程序使用相对较短的反CSRF令牌,可能因为认为这些令牌不会像较短的会话令牌一样受到蛮力攻击。任何向应用程序传送大量可能值的攻击都需要通过受害者的浏览器传送这些值,包括提交大量可能被轻易察觉的请求。此外,如果收到太多无效的反CSRF令牌,应用程序可能会防御性地终止用户的会话,从而阻止相关攻击。但是,这种防御忽略了纯粹在客户端实施的蛮力攻击,而不向服务器发送任何请求的可能性。在某些情况下,可以通过使用基于CSS的技巧来枚举用户的浏览历史记录,从而实施这种攻击。要想成功实施这类攻击,必须满足以下两个条件:

img002 应用程序必须某些时候在URL查询字符串中传输CSRF令牌。这种情况经常发生,因为许多受保护的功能通过目标URL中包含令牌的简单超链接即可访问。

img002 应用程序必须在整个用户会话中使用相同的反CSRF令牌,或者允许多次使用同一个令牌。这种情况也经常发生,一方面是为了改善用户的使用体验,另一方面是为了便于使用浏览器的“后退”和“前进”按钮。

如果满足这些条件,并且目标用户已访问某个包含反CSRF令牌的URL,攻击者就可以从自己的页面实施蛮力攻击。这时,攻击者页面上的一段脚本将动态创建指向目标应用程序上的相关URL的超链接,同时在每个链接中包括一个不同的反CSRF令牌值。然后,该脚本使用JavaScript API getComputedStyle测试用户是否访问了上述链接。确定某个被访问的链接后,即可发现一个有效的反CSRF令牌,然后,攻击者的页面将其用于代表用户执行敏感操作。

需要注意的是,要防范CSRF攻击,仅仅使用多阶段过程执行敏感操作并不够。例如,管理员在添加新用户账户时,他可能会在第一阶段输入相关信息,然后在第二阶段检查并确认这些信息。如果未使用其他反CSRF令牌,该功能将仍然易于受到CSRF攻击,因为攻击者只需要轮流提交两个所需的请求,或者直接提交第二个请求(极为常见)。

少数情况下,应用程序功能会采用另一个令牌;它在一个响应中设置该令牌,然后在接下来的请求中提交该令牌。但是,在这两个阶段之间转换需要进行重定向,因此应用程序采用的防御机制可能会失效。虽然CSRF属于单向攻击,并且无法从应用程序的响应中读取令牌,但如果CSRF响应包含重定向,而且该重定向指向其他包含令牌的URL,受害者的浏览器将自动访问该重定向,并自动在提出的请求中提交令牌。