前言

近日发现了一款有意思的PHP静态代码审计工具——Wpbullet。与其他PHP代码审计工具不同的是,Wpbullet是一款针对WordPress插件/主题开发的静态代码分析工具。

Wordpress自身代码尚且可以说很安全,但是其插件的安全却参差不齐,这款工具可以对WordPress、插件、主题进行静态代码初步的审计,方便后续的漏洞挖掘工作。

由于该工具的说明文档较少,我对其工作原理以及其检测能力比较好奇,因此这篇文章除了简单介绍一下这个工具如何使用之外,更重要的是分析Wpbuttle这块工具的源码,介绍一下它的检测思路。

工具安装

Wpbulle的github地址如下:

https://github.com/webarx-security/wpbullet

安装过程很简单,只需克隆项目、安装依赖并运行脚本即可

python2.x python3.x环境皆可使用。笔者这里测试使用的是python3.7环境

工具使用

可用选项:

fb622d563b38d42d6926bb912edbbbfa.png

值得注意的是Wpbulle这款工具除了支持对本地源代码的审计之外,还支持根据传入的插件/主题
URL
自动下载源码来审计。如上图使用说明可见,–path除了可以传入本地插件目录以外,还支持传入wordpress官网中插件下载路径,工具将对插件下载解压并进行审计操作。

在了解了Wpbulle工具如何安装与使用后,我们来看一下Wpbulle代码,了解一下这个工具是如何实现的,以及其是否能很好的帮助我们挖出漏洞

首先我们来到扫描入口处wpbullet-dev/core/scanner.py

b346bf575c9b71e177aa8a5cf7549764.png

在scan中,首先可以看到其根据需要,从提供的wordpress官网插件地址进行下载的操作,如下图:

4b665e17aac3c50b090098694cf9e8d1.png

上图分别对非zip与zip文件进行下载处理。当然,如果我们用Wpbulle扫描本地插件,是不需要进行上图下载操作。

Scan方法中随后遍历插件目录,对后缀为php的文件调用check_file对文件进行分析,见下图红框出:

d90208a24136a7e1970ecaf0526a41a5.png

我们跟进一下check_file方法

e4269176d33264f49215762926584f92.png

check_file方法中首先读取文件内容,并依次通过passive_check_processor
方法与process_file方法对读取的内容进行处理

passive_check

首先我们来看一下passive_check_processor方法,其实现如下

fc5fa7838808b0a3b9694102c6fa2ef2.png

passive_check方法中分别调用了scope_admin_actions、scope_ajax_hooks、scope_admin_init三个扫描器对文件内容进行扫描

首先我们来看下scope_admin_actions

20392e9fa17660fc48c3f0e5d847b6b3.png

scope_admin_actions方法中提供了一个正则表达式,并对文件内容进行匹配,最终返回匹配的match[4]与match[10]

我们来看下这个正则表达式

(add_action(\s{0,}\S{0,})\((\s{0,}\S{0,})(\“|‘)(admin_action_[a-zA-Z0-9_-]+))(?!{}(\“|‘)(\s{0,}\S{0,}),(.+)(\“|‘)(\s{0,})([a-zA-Z0-9_-]+)(\s{0,})(\“|‘)

要完成什么工作

我们以Keypic任意用户删除漏洞举例:

“最近,我们发现admin_action_钩子存在一个问题,该钩子允许任何登录的用户访问回调函数而不检查发出请求的用户是否有权限访问它们。我们发现该插件的当前版本Keypic 2.1.2,允许任何登录WordPress的人删除其他用户账号。”

详细链接如下

https://www.pluginvulnerabilities.com/2016/08/15/authenticated-user-deletion-vulnerability-in-keypic/

我们再来看下漏洞代码

193f34f21a2278da00a64cd7c545fec7.png

这里涉及到添加action的代码如下:

add_action(‘admin_action_keypic_report_spam_and_delete_user’,
‘keypic_report_spam_and_delete_user’);

通过上文的正则匹配

a377f4dc6aae03f8eb46830bc8d62fc7.png

看一下match[4]与match[10]分别匹配到了什么

f09190ba6e67d5f9d863b200e1608e15.png

9c57480d8cf3fd846060df969c314e07.png

使用工具对该文件进行扫描,扫描结果如下

0f6269c90fdb2ee38e46ecf97d59a98e.png

在wordpress插件中 admin_action_前缀的钩子,均可以通过

http://[WordPress路径] /wp-admin/admin.php?action=xxx

方式访问回调函数,例如案例中任意用户删除漏洞,就可以通过

http://[WordPress路径]
/wp-admin/admin.php?action=keypic_report_spam_and_delete_user&id= [用户ID]

链接触发。

注意,仅仅通过admin_action_前缀注册钩子,并不能保证只允许管理员用户可以访问该功能,这中方式注册的钩子,仅作用于可以通过后台地址来访问,而大多数已经登录的用户,均可以访问admin.php。

接着我们来看下scope_ajax_hooks

86c03f73047d27c7e93f505574a24142.png

fc555aac645d9ffccf002e30bd349494.png

与上文admin_action_前缀注册钩子极为相似,以wp_ajax前缀注册的钩子,可以通过如下链接访问

http:// [WordPress路径] /wp-admin/admin-ajax.php?action=xxx

这样的url来访问回调函数

最后我们来看下scope_admin_ini

e38414407b5e141909af3959de411b2a.png

这里通过正则表达式获取所有通过add_action 函数注admin初始化信息

admin_in前缀注册钩子对应的回调函数可以通过访问admin-ajax.php与admin-post.php地址触发,同样,任意登陆的用户都可以访问该功能。

总的来说:在passive_check环节中,wpBullet使用正则表达式的方式分析所有通过add_action 函数注册的 admin_action、ajax hooks
与 admin_init信息,汇总后输出展示。

process_file

接下来分析下process_file

c100f6c684b13b2a8090583ffa4eaf24.png

process_file模块用来加载预先编译好的扫描插件。

扫描插件存放于Modules目录

128a3c8dbcefeb6a48321afbe6de7b71.png

以代码执行漏洞为例

fa98a31b2e9f9203773f1acada5b59e1.png

在插件中functions列表中罗列出高危函数,在blacklist中罗列过滤函数,程序加载插件后会调用build_pattern方法生成对应的正则规则,如下图

5fe2b3da631cc3fb9a4d669b01adf7ab.png

在生成正则表达式的过程中,除了兼顾规则插件中的高危函数与blacklist,同时也兼顾高危函数中的参数是否可控,见下图user_input

fe5b25fd64faca21f2cf9749025d9216.png

举一个简单的例子如下:

489b4d089638f26699f21e21cc39ae15.png

扫描结果如下:

1ad58522d4b40d2ee895bdb3999d812c.png

在这个环节中,wpBullet通过正则判断是否有用户可控变量未经black_list中的函数过滤直接传入插件高危函数列表中所对应的函数中去。

总结

先说说Wpbullet的优点:Wpbullet是一款少有的针对wordpress审计而开发的基于文本特征的审计工具,其原理不算复杂,可扩展性比较强。

再说说Wpbullet的缺点:Wpbullet是基于文本特征的分析器,与基于AST 树和CFG的RIPS等扫描器相比,Wpbullet很难准确的判断外部输入是否经过安全函数的处理,以目前插件运作的方式来看,漏报量会很大。

但总的来说,使用这款工具还是可以一定程度上辅助我们对wordpress插件进行漏洞挖掘工作。