术语
WordPress
WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截至2018年4月,排名前1000万的网站中超过30.6%使 用WordPress。WordPress是最受欢迎的网站内容管理系统。全球有大约30%的网站都是使用WordPress架设网站的。
Rest-API
REST API 也称为 RESTful API,是遵循 REST 架构规范的应用编程接口。REST 是表述性状态传递的英文缩写。
LFI 本地文件包含漏洞
LFI全称为Local File Inclusion,中文译作本地文件包含漏洞,LFI是能够打开并包含本地文件的漏洞。攻击者利用包含的特性,再加上应用本身对文件控制不严,最终造成了攻击者进行任意文件包含。包含进来的文件都以当前脚本文件解析。
RCE 远程命令/代码执行漏洞
远程连接命令/代码执行漏洞,简称RCE漏洞,能够让攻击者直接向后台服务器远程写入服务器系统命令或者代码,从而控制系统。
WooCommerce
WooCommerce 一款基于 WordPress 的开源电子商务插件。时至今日已变成全球最流行的电商系统,而 WooCommerce 中文站是 薇晓朵 建立的一个中文本地化项目。它是为使用WordPress的小型或大型在线商人而设计的。该插件于2011年9月27日发布,以其易于安装和定制以及免费的基础产品而迅速流行。WooCommerce在WordPress拥有5百万+的用户量。
WOOCS
WooCommerce Currency Switcher (WOOCS)是WooCommerce的多货币插件,它允许你的网站访问者根据设定的货币汇率实时切换产品价格的货币,并以选定的货币支付。允许为WooCommerce商店添加任何货币! 是WooCommerce商城系统不可或缺的货币切换器及多货币付款WordPress插件。WOOCS在WordPress官方统计有6W+的用户量量
利用条件
该漏洞的利用条件:
- WooCommerce Currency Switcher(<= 1.3.6.2)
- 需要一个账号,可在部署WordPress的博客中发布新的文章或者编辑文章
POC
发布一篇文章,然后插入短代码标签即可,pagepath为需要包含的文件路径:
[woocs pagepath='/etc/passwd']
如果需要变为RCE漏洞,需要上传一张包含php内容的图片。
验证结果:
- LFI 验证
- RCE 验证
漏洞分析
漏洞代码分析
先查看WordPress官方仓库,对比下有哪些文件进行了改动。
可以看到修改的文件较多,对官方文档进行阅读后发现,该插件可以支持使用短标签shortcode
方式调用显示,并且支持对短标签进行传入值,在classes/woocs.php
中找到了注册shortcode
的部分。
逐一看一下其具体实现的代码,在分析方法woocs_shortcode
的时候发现了其中最后调用的render_html
有问题,具体如下:
首先会通过args接收短标签传入的值等配置信息,然后进过内部的赋值等操作到最后一步会调用render_html
会传入两个值,一个是写死的woocs.php
的路径,另一个为短标签接收到的参数,跟进该方法看一下具体逻辑。
public function render_html($pagepath, $data = array()) {
@extract($data);
ob_start();
include($pagepath);
return ob_get_clean();
}
可以看到该代码非常简单,在第一步就调用了extract
,而该函数可以从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值。
这样就会导致变量覆盖的问题,接着看到下面直接调用了include($pagepath)
,看到这大家应该就明白了,只需要给传入的$data
数组添加一个为pagepath
的键值对,即可覆盖传入的第一个变量$pagepath
,从而导致达到任意文件包含的问题。
漏洞复现
首先安装该插件并且启用,然后在后台新建一个user1普通用户账号,权限为author(有发布文章、上传图片权限)
然后创建一个图片马(将php内容追加到图片末尾或者构造一个图片格式开头的且具有php内容的图片文件。)
获取到图片路径为wp-content/uploads/2021/07/iShot2021-07-26-15.18.50.png
然后在文章中插入短标签内容,内容如下:
然后访问该文章即可看到漏洞利用的结果。
修复建议
- 更新插件至官方最新版