WordPress CSRF 利用草稿状态

WordPress CSRF Exploit Draft Status

创建新的 post 草稿时如何最好地保护 WP 免受 CSRF 攻击?

如果我添加一个新的 post 并保存为草稿,我可以使用 Burp Suite 拦截请求。

使用 Burp Suite 中的参与工具,我可以更改 post 标题 的值并将 URL 粘贴回浏览器使用更改后的 post 标题创建 new 草稿。

我怎样才能防止这种情况发生?

干杯

WordPress 已经通过使用 nonce 提供了 CSRF 保护机制。创建新的 post 时,会创建一个新的唯一随机数。此随机数是必需的,并且必须与 POST 数据的其余部分一起提交,以便 post 保存为草稿或发布。如果 nonce 不存在或无效,则请求被拒绝。 (使用 Wordpress v4.9.8 测试)

在您的测试中,您能够修改草稿,因为您使用 Burp 提交了正确的随机数,但在 CSRF 攻击中,此值是未知的。 Burp 是一个拦截代理,因此您实际上对自己的 HTTP 流量执行了 MITM 攻击。如果您担心 MITM 攻击,您应该使用 HTTPS。当然,攻击者仍然可以拦截您的网络流量,但所有数据都会被加密。

所以,我不会说这是一个 CSRF 漏洞,而是一个 MITM 漏洞。您可以通过更新您的 WordPress 版本、插件和它们来保护您的 WordPress 安装免受大多数 public 攻击,您还可以在 https://wordpress.org/plugins/tags/security/ 中找到许多与安全相关的插件。

我认为 WordPress 安全测试的最佳工具是 WPScan. It has a huge database of vulnerabilities and it can detect possible exploits and enumerate users, version and plugins. WPScan is mostly a recon tool, but we can test if the reported vulnerabilities are exploitable with Metasploit or Wpxf,这是一个鲜为人知但功能强大的工具,专门用于 WordPress 漏洞利用。请注意,这些工具只能检测和利用 public 漏洞。如果你想发现新的漏洞,那么你可以使用 Burp 或类似的扫描器并研究 WordPress 源代码。

如果我误解了这个问题,并且您的表单没有随机数(假设您正在编写插件),您可以使用 wp_nonce_field and then verify it in the script that receives the form with wp_verify_nonce 添加一个随机数。 但是,如果您的 WordPress 安装不使用其形式的随机数,则不应尝试手动添加随机数,而应更新到较新的版本。

Wordpress 不使用传统的随机数,而是将它们绑定到特定的表单操作和用户 session 组合,并在两次滴答(默认每次 12 小时)内多次使用它们,这意味着它们是默认有效期长达一整天,并且可以在该时间段内重复使用,以及在使用后"refreshed"重置他们的时间整个时期。多年来,安全专家一直批评这具有误导性和不安全性,WordPress 核心团队通过声称某人同时拥有用户 session 和实际随机数的要求来捍卫他们的立场这是一个可以忽略不计的威胁,尽管受感染的主机和没有有效 ssl 保护的站点都可以很容易地实现这一目标。

您遇到的根本问题是 WordPress 随机数根本不是随机数这一事实的症状。它本质上是一个访问控制散列,在短时间内重复用于单个表单操作,并且没有适当的机制来确保其单一使用。这就是为什么您能够成功拦截并 re-use 随机数的原因。仅供参考,这种行为也可以很容易地在 Zed Attack Proxy、Wireshark、Charles Proxy 和许多其他类似实用程序中重现。 Burp 并不是唯一能够发现此弱点的工具。

不过,如果您愿意,您确实可以通过一些途径来纠正此问题,但这相当复杂,而且完成起来并不是特别简单。

以下函数是 可插入的,这意味着您可以用自己的函数覆盖它们,还可以控制系统对随机数的解释。您将需要使用这些特定方法提供您自己的随机数系统,并且 return 与原始预期值相同的值,这样您就不会破坏 plugins/core 代码功能:

例如,您可以使用 elhardoum/nonce-php or wbswjc/nonce, and then implement it through a custom plugin 等包的支持来提供您自己的 nonce 实现,它会覆盖上述可插入函数并将它们用作您自己的 nonce 实现的包装器,尽管这不是非常简单,需要大量自定义逻辑才能实现。

您不仅需要重写上述可插入函数,还需要调用 apply_filters 类似于它们自己的源代码,适当地取消插件尝试进行的任何更改,这些更改将绑定到这些过滤器,并且还 return 与原始格式 完全相同的格式 的预期值,因此您不会破坏您可能正在使用的其他 plugins/themes 实现它们的方式。

如果您认为存在足够的风险,或者您的网站所保护的数据足够重要,那么这可能是值得的。如果您不处理金融交易或敏感数据,在 ssl 后面得到适当保护,或者对编写随机数的自定义实现并随后维护它以解决它不可避免地破坏许多期望默认松散实现的插件的方式没有特别的兴趣在场,那么你最好相信核心开发人员的话并使用默认设置,前提是你经常更新,拥有强大的安全插件,如 wordfence 或 sucuri,并且定期 运行 更新你所有的 plugins/themes.

作为绝对最低要求,您几乎 必须 有 SSL 来减轻 MITM 攻击,并且应该使用适当的访问控制 headers 来减轻 CSRF。