博客

审计WordPress?先从你的插件开始

停止审计WordPress核心,开始审计你的插件:为小团队提供的实用插件优先安全审计。

摘要

大多数WordPress安全审计都是倒退的:它们强调核心更新和扫描器报告,而真正造成伤害的漏洞却存在于插件中。SANS白皮书发现,超过96%的生态系统漏洞源于第三方插件,约43%无需身份验证即可利用。本文介绍如何为小型内部营销团队进行插件优先审计,通过一个因所有人都在扫描错误层面而被入侵的网站故事来展开。你将学习清点和分类每个插件,测试未经验证的攻击面,手动审查用户和日志,并将发现转化为非技术老板能理解的风险语言。结果是定期的分诊仪式,而不是勾选框式的工作。

大多数WordPress安全审计都是做做样子。你花一个下午更新核心、修改管理员密码,然后运行一个插件扫描器,它得意地报告“没有严重问题”。与此同时,那个接受文件上传、上次更新还是在三年前的插件,静静地躺在你的上传目录里,等待着一个不在访客名单上的人。

数字也支持这一点。SANS关于扫描WordPress插件的白皮书发现,WordPress生态系统中超过96%的漏洞源于第三方插件,其中主题占4%,核心不到1%。大约43%的这些漏洞可以在无需任何身份验证的情况下被利用。因此,当你的审计将大部分精力放在核心上时,你就像在检查树木,而旁边的插件目录里已经燃起了森林大火。

这并不是要你对核心感到恐慌。像最近获得公开利用的wp2shell RCE漏洞这样的核心漏洞,应在公布的当天就进行修补。但它们足够罕见,不值得你在审计时间中占大头。大部分时间应花在插件上,这才是真正工作流程的开始。

想象一下之前的场景:一个周日早晨,你的网站被重定向到一个赌博页面,老板发邮件说“我以为我们有安全措施”。你确实有安全措施——你做了一次勾选框式的审计。之后的场景则是一个分诊系统,它将插件视为真正的攻击面,从外部测试它们,并检查扫描器无法看到的东西。

你在一个小型营销团队工作,运营着一个自2017年就上线的WordPress网站。它有一个自由职业者在2019年构建的自定义活动注册插件,一个带有文件上传字段的联系表单插件,以及一个已被出售且不再有公开更新页面的幻灯片插件。这并不是一个不寻常的技术栈。这就是你审计的起点。


插件清单就是你的安全策略

对每个插件和主题进行清点。记下版本、最后更新日期、供应商是否仍然活跃,以及是否真的有人在使用。然后将每个插件分类:维护且使用、维护但未使用、已废弃但使用、已废弃且未使用。立即移除未使用的插件。忽略“每月只需50美元”的辩护——未使用的插件是负债,而不是功能。对于已废弃但仍在使用的插件,做出决定:替换它,或者接受风险并将其记录在老板看过的风险登记册中。

事件注册插件属于“已废弃但使用”这一类。它处理付款并发送确认邮件,替换它是个大工程,所以暂时保留。但你要写个备注:“这可能是未来泄露的最可能来源”,并将其放在测试列表的顶部。

攻击面WordPress已知漏洞占比审计优先级
第三方插件超过96%最高 — 清点、扫描、测试、替换
主题约4%中等 — 仅当自定义或过时时
WordPress核心低于1%低 — 保持更新,继续前进

当SecurityWeek在2024年统计到超过8000个新的WordPress漏洞时,绝大多数都是这种类型:插件问题,而不是核心补丁。扫描器会告诉你那些已公开并被分配了CVE编号的漏洞。它不会告诉你没有CVE的自定义自由职业者代码,因为没有人仔细看过它。这种手动检查是你的工作。要深入了解插件特定的检查,请参阅本指南:审计你的WordPress插件是否存在漏洞


像陌生人一样测试:无需密码的43%

你的扫描器已经告诉你一切正常。现在做它做不到的事:从外部探测网站,无需登录。从每个文件上传字段、每个处理POST的表单、每个admin-ajax端点开始。上传是否真的检查了文件内容,还是只检查了扩展名?上传的文件会存储在哪里,Web服务器能否在该目录中执行PHP?43%无需身份验证的插件漏洞通常恰恰位于这些地方:未经验证的存储型XSS、任意文件上传和PHP对象注入。

联系表单插件允许访客附加简历。它使用访客的原始文件名重命名文件,因此你上传“resume.php”,它会保存到设计上可写的/uploads/contact/文件夹中。如果服务器还允许在该目录中运行PHP,攻击者就获得了webshell。Fastly已记录了WordPress插件中未经验证的存储型XSS的活跃利用——这不是小众的幻灯片风险。你的测试很简单:创建一个内容已知的文件,上传它,看看它是否以原始名称和类型返回。然后尝试上传一个.php文件。如果它仍以.php返回,你就发现了一个可利用的漏洞。

这也是“但我们的安全插件有WAF”这个论点站不住脚的地方。WAF可以阻止已知的负载,但它依赖的路径规范化规则通常与服务器的实际行为不一致。OWASP Web安全测试指南比任何仪表盘都更适合作为参考:它描述了如何系统地测试文件上传漏洞和存储型XSS。如果你发现插件已被废弃,是时候采取清理协议了:废弃WordPress插件的隐藏危险解释了为什么保留一个死扩展比移除它并调整工作流程更糟糕。


扫描器看不到的东西:用户、日志和旧代码

动态测试能捕获当前暴露的内容。手动审查能捕获已经存在于内部的内容。从用户账户开始:打开管理员列表,查找不是你创建的账户。一个名为“support”的管理员,使用免费邮箱地址且背后没有真实的人,那是后门,而不是同事。检查wp-content/uploads中的文件时间戳,看是否有最近修改但不是你的内容。检查服务器访问日志,寻找看起来像机器人的curl命令而不是真实浏览器发出的请求。

事件插件有一个“演讲者照片”上传功能,保存到uploads/event-headshots/目录。在测试中,你发现一个不属于你的文件——一个名字看起来随机的PHP小文件。这就是你的webshell。它是通过你两周前测试过的同一个上传漏洞进来的,而到现在扫描器仍然“看不到”它,因为它不是插件漏洞,而是漏洞的证据。手动审查找到它,删除它,并检查日志找出放置它的IP地址。Invicti指出,插件中的PHP对象注入正在上升,而且它几乎对黑盒扫描不可见,因为恶意对象只在执行时才具体化。发现它的唯一方法是阅读代码,寻找危险模式,比如对用户提供的输入调用unserialize()。阅读自定义插件的几百行代码比支付事件响应预付费更便宜。

这也是“只要安装更多安全插件”的标准建议达到极限的地方。叠加三个安全插件会导致WAF规则重叠、互相干扰,大量重复的日志邮件,以及偶尔在你自己管理员登录时出现“您已被禁止”的错误。一个配置良好的活跃安全插件就足够了。在添加其他任何东西之前,请阅读关于为什么太多安全插件会适得其反的文章。


在不引起恐慌的情况下向老板说明真相

你的老板不关心CVSS评分或PHP对象注入。他关心的是网站宕机、商店无法接单以及IT预算。翻译很简单:“这个插件有一个已知的未经验证的远程代码执行漏洞。陌生人可以删除我们网站的内容或安装后门。我们需要在本季度替换它。”然后展示优先事项列表:替换事件插件,禁用联系表单的文件上传功能直到它能正确验证文件类型,轮换所有管理员凭据,并安排下一次季度审查。

你还有一个语言优势:CISA维护着已知漏洞利用目录,它告诉你哪些已发布的漏洞正在被积极利用。如果任何你的插件出现在那里,那么论点就不再是理论上的——已知的利用存在,你正在倒计时。如果没有,也用它作为“紧急”含义的标准。CISA的跟踪使得更容易说服非技术老板,这不是一封钓鱼邮件;而是一个公开的数据库,显示了攻击者现在正在做什么。当季度结束时,你将拥有一个修复工作流程,而不是一次性的勾选框练习。将漏洞转化为补丁周期的工作流程能保持这一习惯。


之前的情况是一个崩溃的网站、一封狂乱的电子邮件和一份声称一切正常的干净扫描报告。之后是一种季度仪式:清点、分类、从外部测试、审查用户和日志,并写下你做出的决定和接受的风险。扫描器变成了寻找目标的地图,而不是健康证明。插件变成了你如数家珍的清单。下次老板再问起审计时,你将有一个不需要祈祷的答案。

Sources (5)