是否可以使用 PHP 中的 file_get_contents 破坏 CSRF 令牌验证

Is it possible to break CSRF token validation using file_get_contents in PHP

在每个会话的表单上使用令牌的 CSRF 预防方法是一种流行的方法。但是,如果 PHP 的 file_get_contents 可以获取跨域文件表单的内容,我不明白这种令牌方式如何保护 --> 它可以获取表单上的令牌并使用它。

那么这种令牌方式是如何工作的呢?

如果我很好地理解你的问题,你正在想象这样一个可能的漏洞利用:

  1. 攻击者创建一个 PHP 页面,该页面将向目标用户呈现虚假表单
  2. 攻击者的 PHP 脚本将执行 file_get_contents 从他试图利用的目标站点下载表单 (HTML),并删除 CSRF从下载的 HTML 获取令牌,并将此 CSRF 令牌添加到呈现给用户的虚假表单中。

  3. 毫无戒心的用户将提交表单,并且将在此用户会话.

    的上下文中在目标站点中执行意外请求
  4. 目标站点的 CSRF 检查将通过 OK,因为我们的请求中有一个有效的 CSRF 令牌

但是等等..我们有有效的令牌吗?我们真的吗! 如果目标站点以正确的方式实施 CSRF,则不会。

会话是这里的关键。当您执行 file_get_contents 从目标站点下载表单时,请求在其自己的会话上下文中执行, file_get_contents 进程是那里的客户端,并且为该请求生成的 CSRF 令牌将是(必须)仅在该特定会话的上下文中有效。 稍后,当目标用户提交您的伪造表单时,该请求在该用户会话的上下文中执行,该会话与 file_get_contents 会话不同,因此如果 CSRF 检查由以适当的方式访问目标站点。

这里有一篇来自 OWASP 的好文章,可以进一步了解推荐的 Synchronizer Token Pattern for prevention of CSRF