【问题标题】:Using stolen cookie in cURL to bypass CSRF在 cURL 中使用窃取的 cookie 绕过 CSRF
【发布时间】:2013-12-08 16:44:30
【问题描述】:

我必须处理一个网页。该网页基于YII framework,登录页面受CSRF tokens保护。当我通过POST method 传递登录凭据时。我收到 error 400The CSRF token could not be verified 消息。

我不知道如何绕过这个保护。我不明白这个机制。当我通过 Chrome 浏览器登录时,我看到了 POST 消息的样子。它有 4 个参数:CSRF 密钥、登录名、密码、一个空变量。浏览器如何获取正确的 CSRF 密钥以进行打磨?

我有这个网页的登录名和密码,我可以作为普通用户登录。只有登录页面受到 CSRF 保护。我可以在正常登录时使用浏览器创建的cookie(如何做到这一点),给这个cookie to cURL并在登录页面后面开始处理URLs吗?

【问题讨论】:

  • CSRF 密钥有超时限制,所以如果你使用上次登录时的 csrf 密钥(比如两天前)登录页面应该会报错
  • 每次我重新登录 Chrome 时,CSRF 密钥都不同。因此我认为 CSRF 密钥只是一种用途。
  • 已解决:CSRF 密钥是为会话生成的,它以纯文本形式位于登录页面内。我可以从登录页面的源代码中复制它,并提供给 cURL 脚本以作为 POST 变量过去。 CSRF Key 在每次页面刷新后都不会改变,一个 KEY 在注销之前是有效的。注销时,CSRF 密钥被打磨到服务器以终止。
  • @MrMgr 你应该使用上面的这个评论,并用它来回答你自己的问题。这样,遇到相同问题的任何其他人都可以轻松了解如何解决。

标签: php cookies curl yii csrf


【解决方案1】:

MrMgr 在他的 cmets 中回答。我把它放在这里是为了帮助其他人轻松找出答案。

CSRF 密钥是为会话生成的,它以纯文本形式在 LOGIN 页面内。我可以从登录页面的源代码中复制它,并提供给 cURL 脚本以作为 POST 变量过去。 CSRF Key 在每次页面刷新后都不会改变,一个 KEY 在注销之前是有效的。在注销时,CSRF 密钥被打磨到服务器以进行终止。

Source

【讨论】:

    【解决方案2】:

    CSRF 令牌已经到位,使这种精确的操作变得困难。您需要一种更好的方法来欺骗使用 PHP 的浏览器。为此,请将所有 cookie 存储在通常称为“cookie jar”的地方。 PHP 对 curl has that capability 的实现。从现在开始,所有路由到这个站点的 curl 请求都应该使用这个 cookie jar。

    接下来您需要解析登录页面以获取所有提交的字段。这包括用户名、密码、CSRF 和其他隐藏字段。确保你对每一个都有价值。如果您不应该输入它(例如隐藏输入),请抓取登录页面的 HTML 并将这些字段放入您可以在登录 POST 中传递的变量中。还要确保在登录 POST 中发送您作为引用者抓取的登录页面的 url。

    解析 html 可能很乏味,但如果您熟悉 CSS 选择器,像 SimpleHTMLDOM 这样的库应该会使其变得简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2017-08-18
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多