[TOC]

1.关于此系列文章

WordPress插件漏洞挖掘系列文章流程大概为:简单了解插件结构-》尝试开发第一个插件-》插件漏洞的一次复现-》插件漏洞挖掘首尝试,在这系列文中对于有PHP基础的基本没什么压力,但是没有PHP基础也不要方,只要看到不明白的函数或者关键字网上搜一下,然后通过上下文关联基本上就可以得知该行代码做了什么操作。有什么用途了,由于这系列以挖洞为主,所以涉及到开发方面的知识点就不过多介绍。

由于对WordPress以及插件运行流程所拥有知识点并没那么透彻,因此本文中可能会存在错误地方,还望各位师傅可以指出,感谢包容。


2.前言

在挖掘一套程序的插件漏洞,首先得先了解下插件在这套程序中的一个流程是怎么样的,入口点、挂载点、系统函数等信息。


3.插件简单介绍

3.1.插件目录结构

正常来说无论是开发程序还是开发程序的插件,有开发经验的开发者都是会遵循开发所需的原则,比如:命名规范、以及目录结构格式等,这样一来也是更加可以清晰的看懂插件的对应代码。

WordPress插件是存储在:/wp-content/plugins文件夹内,plugins里面每个文件夹则为一个插件,只要下载下来的插件默认都会存储在这个位置:

比如创建一个插件名字为test-plugin,那么插件主文件就可以起为test-plugin.php,插件中可能会引用到一些:jscssimage资源文件或者其它PHP文件,那么这个时候就可以在插件文件夹里面在创建新的文件夹存储这些资源、代码文件,最后再将整个插件文件夹存储至:/wp-content/plugins/ 即可,正常来说开发者都会把插件文件夹名字起的与插件主文件名字相同,当然这个是因人而异,问题不大。

无论开发程序还是插件的时候都应该架构一个良好清晰的目录结构, 比如上述所说开发插件所需要的资源文件等,都可以分开存储,这样一来目录结构则更加简洁可观,如:

test-plugin
  |----include
  |      |----js
  |      |----css
  |      |----xxxx.php
  |----image
  |----wp-test-plugin.php
  |----uninstall.php
  |----settings.php
  |----readme.txt

wordpress中绝大部分插件的目录结构基本上会有以上述所呈现的样子。只有可能资源文件存放位置不同,但是插件主文件(wp-test-plugin.php)、插件卸载文件(uninstall.php)、插件设置文件(settings.php)基本上都是标配,但是不排除一些插件是没有卸载与设置文件的,而readme.txt文件是在开发者想将插件提交至WordPress官方的话那么这个是得创建的,这里面的内容是作为说明的作用,里面可以说明插件功能、安装等使用说明信息。


3.2.插件命名

在开发插件编写函数的时候在函数名或者插件名前加一个不容易重复的前缀是很有必要的,一套程序中插件有无数,因此起名也成为了头痛的事情,因为只要起的通用一点的名字分分钟就重复。一重复就报错,然而就GG了,一顶要有唯一性。


4.WordPress插件钩子(挂载点) * 重要

4.1.插件钩子介绍

钩子(hooks)WordPress插件中起到重要的作用,主要做些什么呢?其实就是说在你插件流程运行到某个特定的地方的时候就会调用当前与钩子有关联的函数,也就是这些钩子可以实现不改变WordPress核心功能对原有功能进行改变。
举个例子,比如我在某个帖子内提交一条评论留言,在原有评论功能里是没有评论有回复则邮件发送给评论者进行提示,那么这个时候就可以开发一个插件,并且运用到钩子(hooks)也就是挂载点,那么我们就可以将函数与事件进行绑定,绑定完成之后,只要程序流程运行走到这个事件,那么就会触发挂载点,也就是调用所绑定的函数。


4.2.插件钩子类型

4.2.1.动作钩子

动作钩子就是我们上面介绍所说的类似,运行到某个指定地方,就会被执行的一种插件钩子。
动作钩子对应的使用方法为:add_action ('事件','函数名') 该函数共有4个参数,最后两个都有默认值,正常情况不必填写,默认即可。

用法如下:

function lock_article($post_id)
{
    //比如这个定义的函数是在发布文章的时候自动加上锁
}
add_action('publish_post','lock_article');

这个时候,只要流程运行到了publish_post事件动作,那么就会触发lock_article函数


4.2.2.过滤器

这种类型只要用于修改发送出去或者保存的数据,可以通过过滤器在运行到某个地方的时候对传输进来的数据进行操作。
过滤器对应的使用方法为:add_filter ('事件','函数名') 该函数共有4个参数,最后两个都有默认值,正常情况不必填写,默认即可。

用法如下:

add_filter( 'wp_title', 'test_filter_title'); 

function test_filter_title($title)
{
    //过滤标题某个字符或者其它操作
}

那么只要在流程中执行了传递以及处理数据,并且走到了wp_title这个过滤钩子的话,就会直接test_filter_title函数,对原有的数据进行处理。


6.2.3.钩子类型简单总结

其实两种类型道理都是一样,运行到指定地方,做指定的事情,也就是实现了不更改程序核心代码从而修改功能流程。
注意:自己定义的函数以及钩子调用必须保存在同一个文件中。
add_actionadd_filter的最后两个参数分别是:优先级(默认10),以及钩子接收的参数数量(默认1)
如果你发现你的钩子与其它插件或者其它代码起冲突,这个时候就可以使用remove_action或者remove_filter进行移除钩子,也是差不多的用法,在特定的时候移除掉,就是在特定的钩子事件的时候不执行。


5.总结

开发插件涉及到的内容并没有以上那么少,但是必须知道的都在上面已经讲到,有些东西得配合插件开发一起讲才能更加清晰的理解,所以在下一篇中,所分享的内容可能会略多一点。

当你看到这里的时候,如果上文所描述的内容你觉得没压力,能消化的话,那么很高兴的告诉你,你已经可以成功开发一款简单的WordPress插件啦,那么在下一篇文中让我们一起走进WordPress插件开发的世界吧。
当然,如果你看完之后感觉有点理不清也没关系,相信你看完下一篇插件开发实例之后在回来看这一篇文,相信你会看的更加透彻。

其实挖程序漏洞与挖程序插件漏洞是没有区别的,本质上都是一样,唯一区别就是危害性,挖插件漏洞主要就是看挖的插件安装人数多不多,但是漏洞的危害性还是一样的,如某个公开的插件漏洞一样:

源链接

Hacking more

...