WordPress CSRF漏洞利用草案状态

时间:2018-09-25 14:09:29

标签: php wordpress security csrf csrf-protection

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

如果我添加新帖子并另存为草稿,则可以使用Burp Suite截获该请求。

使用Burp Suite中的参与工具,我可以更改帖子标题的值,然后将URL粘贴回浏览器中,该浏览器将创建一个 new 草稿。更改了帖子标题。

我如何防止这种情况发生?

欢呼

2 个答案:

答案 0 :(得分:6)

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

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

因此,我不会说这是CSRF攻击,而是MITM攻击。您可以通过更新WordPress版本,插件及其更新来保护WordPress安装不受大多数​​公共漏洞的侵害,并且您可以在https://wordpress.org/plugins/tags/security/中找到许多与安全相关的插件。

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

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

答案 1 :(得分:3)

Wordpress不使用传统的随机数,而是将它们绑定到特定的表单操作和用户会话组合,并将其保留两次(两次默认为12小时)以多次使用(这默认情况下最多可使用一次)。全天,并且可以在该时间段内重复使用,也可以在完全重置其时间段后“刷新”。多年来,安全专家一直批评这种做法具有误导性和不安全性,而WordPress核心团队则辩称他们要求有人同时拥有用户会话和实际随机数,从而可以忽略不计,从而捍卫了他们的立场。 ,尽管受感染的主机以及没有有效ssl保护的网站都可以很容易地做到这一点。

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

但是,您确实可以根据需要进行更正,但这是一项复杂的工作,并非易事。

以下功能是可插拔的,这意味着您可以使用自己的功能覆盖它们,还可以控制系统对现成的解释。您将需要使用以下特定方法提供自己的随机数系统,并将相同的值返回到原始预期值,以免破坏插件/核心代码的功能:

例如,您可以使用来自elhardoum/nonce-phpwbswjc/nonce之类程序包的支持来提供自己的随机数实现,然后通过覆盖以上可插拔功能的custom plugin来实现。函数并使用它们作为您自己的nonce实现的包装器,尽管这并不是非常简单,而且需要大量的自定义逻辑来实现。

您不仅需要覆盖上述可插拔函数,而且还需要类似于其自身的源来调用apply_filters,适当地使插件尝试对绑定到这些过滤器的任何更改无效,并返回与原始格式格式完全相同的期望值,因此您不会破坏其他正在使用的插件/主题实现它们的方式。

如果您认为存在足够的风险,或者您的站点保护的数据具有足够的重要性,则可能值得付出努力。如果您不处理金融交易或敏感数据,已在ssl后面得到适当保护,或者对编写自定义的现时实现并随后对其进行维护以解决不可避免地破坏众多期望默认松懈实现的插件的方式没有特别兴趣,出现,那么您最好是让核心开发人员如愿以偿,并使用默认值,前提是您要经常更新,并拥有强大的安全插件(如wordfence或sucuri),并定期在所有插件/主题上运行更新。

作为一个绝对的最低要求,您必须使用适当的SSL来缓解MITM攻击,并且应该使用适当的访问控制标头来缓解CSRF。