在这个任务中,我们需要使用 Elgg 社交网络中有两个用户:Alice 和 Samy。Samy 想要成为 Alice 的好友,但 Alice 并不想将他加到自己的好友列表中。Samy 决定使用 CSRF 攻击来实现这个目标。他会通过邮件或在 Elgg 里给 Alice 发一个 URL。当 Alice 好奇点击该 URL 后,她会被引导至 Samy 的网站:www.attacker32.com。请假装你是 Samy,描述你如何构建网页内容,以便当 Alice 访问此页面后,Samy 就会成为 Alice 好友列表中的成员(假设 Alice 当前的 Elgg 会话还是有效的)。
为了给受害者添加好友,我们需要知道合法的"添加好友"的 HTTP 请求(GET 请求)是什么样的。我们可以使用 "HTTP Header Live" 工具进行调查。在这个任务中,不允许编写 JavaScript 代码来发动 CSRF 攻击。你的工作是当 Alice 访问页面后攻击会立即发动,Alice 无需在页面上点击任何内容。下面例子中的 img 标签会自动触发一个 HTTP GET 请求。你需要在 www.attacker32.com 网站服务器上建一个攻击的页面,这个页面应该放在攻击者容器的 /var/www/attacker 目录下,但我们已经把主机上的 Labsetup/attacker 文件夹挂载到了攻击者容器的 /var/www/attacker 文件夹上,所以在主机上的 Labsetup/attacker 里建网页就可以了。
<html>
<body>
<h1>This page forges an HTTP GET request</h1>
<img src="" alt="image" width="1" height="1" />
</body>
</html>
Elgg 实现了一种防御 CSRF 攻击的措施。在"添加好友"的 HTTP 请求中,您可能会注意到每个请求都包含了两个看起来很奇怪的参数,即 __elgg_ts 和 __elgg_token。这两个参数用于此防护措施,如果它们的值不正确,Elgg 则不会接受该请求。我们在本实验中关闭了这种防御措施,因此在伪造请求时无需包括这两个参数。
重要说明: 如果你使用的是云虚拟机或非 SEED 的其他虚拟机,您的 VM 中的 Firefox 版本可能较新,并且可能会对跨站 cookie 采取一些限制。在较新的版本中,使用 img 标签来伪造 HTTP GET 请求将无法使攻击成功。这是因为浏览器对这类请求会阻止跨站 cookie。如果您遇到这种情况,您可以选择以下方法之一使攻击生效:
- 不使用 img 标签,而是使用其他方式生成 GET 请求。例如,在下一个任务中我们使用 JavaScript 来伪造 POST 请求。我们可以使用相同的方法来伪造 GET 请求。
- 更改 Firefox 设置以取消这些限制。学生需要找出应该取消哪个限制条款。该限制设置在“隐私与安全”页面上,可以通过在 URL 场景中输入 about:preferences#privacy 来查看。
如果你使用的是我们提供的 SEEDUbuntu 20.04 虚拟机,则此方法仍然有效,除非您已将 Firefox 升级到较新的版本。