WordPress Ninja Forms插件 CSRF to XSS漏洞(CVE-2020-12462)分析

前言

Ninja Forms是一款WordPress插件。使用Ninja Forms插件无需编码即可以创建美观、用户友好的WordPress表单。据统计,全球超过 2,000,000 个网站正在使用 Ninja Forms。

Ninja Forms 3.4.24.2之前的所有版本中存在一个严重的CSRF to XSS漏洞。成功利用此漏洞可以使得攻击者将WordPress网站中启用的Ninja Forms表单替换为包含恶意JavaScript的表单。当用户使用这些表单时触发xss漏洞。

漏洞分析

根据漏洞披露来看,本次漏洞存在于ninja-forms\lib\NF_Upgrade.php文件 ninja_forms_ajax_import_form函数

在分析漏洞之前,我们先来了解下这个存在漏洞的文件是做什么用的。存在漏洞的文件名为NF_Upgrade.php,从字面意义上来看,是升级的意思,但这个文件的功能并不是如同其命名(Upgrade)那样用来升级ninja-forms插件版本,而是涉及到ninja-forms的一个特殊功能——“降级”
Ninja Forms插件中存在着一个名为 “降级”的功能。使用该功能用户可以将其表单样式和功能恢复为该插件2.9.x版本

使用降级后,将删除目前安装的3.0版本的所有表单数据。因此该功能提示用户在使用该功能前导出表单数据。

从后台代码来看,点击降级按钮后,程序启用位于deprecated路径的旧版ninja-forms入口文件

下图是位于deprecated路径的2.x版本ninja-forms入口文件

作为降级功能的一部分,ninja-forms编写了NF_Upgrade.php文件,文件中AJAX函数旨在在使用“降级”模式时可以导入正常模式中导出的表单

在了解了NF_Upgrade.php文件存在的意义之后,接下来分析下NF_Upgrade.php文件中存在漏洞的ninja_forms_ajax_import_form函数

NF_Upgrade.php文件在25行处通过add_action注册了一个连接到ninja_forms_ajax_import_form函数的hook

因此可以通过访问如下链接来触发ninja_forms_ajax_import_form函数

在了解了ninja_forms_ajax_import_form函数如何通过请求调用后,继续分析该函数

ninja_forms_ajax_import_form函数在27行处检验了用户权限

在29行处获取POST请求中import参数,在31行处获取POST请求中formID参数

程序在35行处将POST中提交的import参数与formID参数传入import_form函数中进行导入处理

ninja_forms_ajax_import_form函数的作用,从对上文代码的理解,应该是用来给管理员提供导入表单功能用的。

但是ninja_forms_ajax_import_form函数在安全上仅仅校验了使用者的权限,这点确实可以防止未授权访问的发生,但并未校验提交表单中的csrf token进行校验,并不能防范csrf漏洞,因此攻击者可以构造一个恶意页面链接诱骗管理员点击,从而向Ninja Forms插件提交一个导入恶意表单的请求。

ninja_forms_ajax_import_form函数接收POST传入的两个参数:import参数与formID参数,import参数中的内容是导入表单的数据,formID参数值是对应的表单id。经过实际测试发现,如果formID参数设置为一个已经存在的表单,则导入的表单内容将会覆盖原有表单。

在测试环境中有如下表单normal_form。攻击者可以通过查看使用该表单的页面源码来获得formID,这里normal_form的formID为2

normal_form是一个简单的单行文本表单

如果攻击者向在这个表单中插入一些恶意的js脚本,则可以在攻击时指定POST中formID为2

要覆盖的目标有了,但是导入的数据信息到底怎么构造呢?

回头看下ninja_forms_ajax_import_form函数

ninja_forms_ajax_import_form函数从POST请求中获取import参数,这个值就是导入模板的信息。接着程序将其传入import_form方法中进行导入处理。

$_POST[‘import’]值应该是什么样子的呢?只有知道了这个值的格式,我们才好构造payload

经过一番搜索,位于wp-content\plugins\ninja-forms\ninja-forms.php文件中

我们可以看到如上的代码

可见程序通过template方法读取位于wp-content\plugins\ninja-forms\includes\Templates\
文件夹的formtemplate-contactform.nff文件内容,并传入import_form接口

formtemplate-contactform.nff文件是这个样子的

到这里就很好办了,.nff文件正是ninja forms插件导出表单的默认格式。

因此利用思路比较清晰了

  1. 攻击者在本地模仿目标表单模板构造一个含有恶意代码的表单模板

  2. 通过ninja forms插件将其导出为.nff文件

  3. 构造csrf页面,该页面会在管理员访问时发起csrf攻击,使用恶意的表单模板替换原有模板

  4. 诱使管理员访问

  5. 当用户与管理员使用这个恶意表单的页面时,xss将会被触发

现在已经理清利用思路,接下来构造一个恶意的.nff文件。模仿上文的normal_form表单,攻击者可以构造一个与之相似的恶意表单,与之不同的是,攻击者在描述处加入一行js脚本

攻击者将这个恶意的表单模板导出

导出的恶意表单部分内容如下

攻击者构造一个表单提交页面,表单提交的地址为http://x.x.x.x/wordpress/wp-admin/admin-ajax.php?action=ninja_forms_ajax_import_form
提交内容中import值为恶意文件内容、formID值为要覆盖的原normal_form的id,并诱使管理员点击页面链接

当攻击成功后,normal_form表单将会被恶意的表单覆盖

当用户使用该表单进行提交时

点击submit时xss被触发

不仅如此,当管理员在后台管理编辑该表单时,当进入编辑页面,xss仍然可以被触发

总结

该漏洞在3.4.24.2版中完全修复。在分析这个漏洞的过程中,发现ninja_forms插件非常的好用,推荐有需要的朋友可以试用下。

本文来源于: https://xz.aliyun.com/t/7768

相关推荐

nodejs一些入门特性&&实战

最近发觉nodejs的一些特性很有意思,对此进行一番小结,有不足之处请师傅们补充。 原型链 源自JavaScript的原型继承模型。 prototype(原型) 几乎js的所有对象都是Object的实例,我们没办法使用class自写一个类。

php和python反序列化漏洞分析

之前一直有接触挺多反序列化的漏洞,但是自己一直没有很细心地学习这方面的东西,所以现在花时间分析一下php、python中的反序列化漏洞,其大体都是差不多的,部分代码来源互联网,有错误烦请各位师傅指正。 序列化 (Serialization)

php代码审计学习之函数缺陷

php代码审计学习之函数缺陷 感兴趣的可以参考一下PHP-Audit-Labs in_array函数缺陷 Wish List Code class Challenge { const UPLOAD_DIRECTORY = './soluti

CVE-Flow:1999-2020年CVE数据分析【1】

给大家汇报一下最近工作,主要做了这么几个事情: 1999-2020年CVE数据分析。 增量CVE数据的T级监控。 EXP预警。 全局自动化。 产出及价值 汇总产出一份近20年来CVE原始数据集:CVE2020,且持续自动更新,具备66个属性

WAF绕过之SQL注入(归来)

Author:flystart Team: ms509 Date:2020/5 前言: WAF(Web Application Firewall)对于从事信息安全领域的工作者来说并不陌生,在渗透测试一个目标的时候常常作为拦路虎让人头痛不已,

CVE-2019-18679 Squid 敏感信息泄漏

0x1 前言 Squid是一个开源的高性能的代理缓存服务器。它接受来自客户端的请求并适当地处理这些请求。例如,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器并向这个页面发出请求。然后,Squi

某cms代码审计引发的思考

0x01、前言 在CNVD闲逛的时候看到这款CMS,发现常见的用于getshell的漏洞都有人提交过,顿时来了兴趣,下载下来经过审计发现漏洞的利用方式和常规方法稍有不同,尤其是对于文件上传的漏洞来说,在以前的测试中主要集中在图片附件之类的地

Potato家族本地提权细节

本文结合POC源码,研究Potato家族本地提权细节 Feature or vulnerability 该提权手法的前提是拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限,以下

一次对参数编码混淆越权的尝试

一、前言 当你进行越权测试遇到参数被混淆编码时是简单的尝试然后放弃,还是和他杠上?,本文将介绍一次对某系统某参数有混淆编码的越权尝试。 二、越权尝试 1、登录某系统,点击保存 2、使用burp抓包,发现key参数: RuYW1lPVRfW

CVE-2017-16995复现与分析

CVE-2017-16995复现与分析 前言 CVE-2017-16995是一个内核提权漏洞,最近PWN2OWN爆出了一个ebpf模块相关的提权漏洞,因此打算系统地学习一下ebpf这个内核模块,并复现和分析与之相关的内核漏洞,之前先知已经有

Bug Bounty:$20000 Facebook DOM XSS

window.postMessage()方法保证窗口对象之间的安全跨域通信;例如,在页面和它产生的弹出窗口之间,或者在页面和嵌入其中的iFrame之间。 更多关于window.postMessage()方法的知识可以查阅Mozilla Po