WordPress CSRF漏洞利用草案状态



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

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

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

我该如何防范这种情况?

干杯

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

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

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

我认为在WordPress上进行安全测试的最佳工具是WPScan。它有一个庞大的漏洞数据库,可以检测可能的漏洞并枚举用户、版本和插件。WPScan主要是一种侦察工具,但我们可以使用Metasploit或Wpxf测试报告的漏洞是否可利用,这是一种不太为人所知但功能强大的工具,专门用于利用WordPress。请注意,这些工具只能检测和利用公共漏洞。如果你想发现新的漏洞,那么你可以使用Burp或类似的扫描仪来研究WordPress的源代码。

如果我误解了这个问题,并且您的表单没有nonce(假设您正在编写一个插件),您可以使用wp_nonce_field添加一个nonce,然后在接收带有wp_verify_nonce的表单的脚本中验证它。然而,如果你的WordPress安装不在表单中使用nonce,你不应该尝试手动添加nonce,而是更新到新版本。

Wordpress不使用传统的nonce,而是将它们绑定到特定的表单操作和用户会话组合,并在两个刻度(默认每个刻度12小时)内多次使用,这意味着它们在默认情况下最多有效一整天,并且可以在该时间段内重复使用,以及在使用完全重置其时间段后被"刷新">。多年来,这一直被安全专业人士批评为误导和不安全,WordPress核心团队为他们的立场进行了辩护,声称要求某人同时拥有用户会话和实际nonce使这一威胁可以忽略不计,尽管受损的主机和没有有效ssl保护的站点都可以很容易地实现这一点。

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

然而,如果你愿意的话,你确实可以采取一些措施来纠正这一点,但这相当复杂,而且实现起来并不特别简单。

以下函数是可插入的,这意味着你可以用自己的函数覆盖它们,也可以控制系统对nonce的解释。你需要使用这些特定的方法提供自己的nonce系统,并返回与原始预期值相同的值,这样你就不会破坏插件/核心代码功能:

  • wp_nonce_field
  • wp_nonce_tick
  • wp_verify_nonce
  • wp_create_nonce

例如,您可以使用诸如elhardoum/nonce php或wbswjc/nonce之类的包的支持来提供自己的nonce实现,然后通过一个自定义插件来实现它,该插件覆盖上述可插入函数,并将它们用作自己nonce实现的包装器,尽管这不是非常简单,并且需要大量的自定义逻辑来实现。

您不仅需要覆盖上述可插入函数,还需要类似于它们自己的源代码来调用apply_filters,正确地取消插件试图进行的与这些过滤器绑定的任何更改,并以与原始插件完全相同的格式返回期望值,这样您就不会干扰您可能使用的其他插件/主题如何实现它们。

如果您认为存在足够的风险,或者您的网站所保护的数据具有足够的重要性,那么这可能是值得的。如果你没有处理金融交易或敏感数据,在ssl之后得到了适当的保护,或者对编写nonce的自定义实现并随后维护它没有特别的兴趣,以避免它不可避免地破坏许多插件,这些插件希望默认的宽松实现存在,那么,如果你经常更新,拥有像wordfence或sucuri这样的强大安全插件,并定期对所有插件/主题运行更新,那么你可能最好按照核心开发人员的话,使用默认值。

作为绝对最低要求,您必须设置SSL以减轻MITM攻击,并且应该使用适当的访问控制标头来减轻CSRF。

最新更新