漏洞描述
WordPress 插件Recall 存在SQL注入漏洞,导致获取数据泄露。
影响版本
<= 16.26.5
漏洞复现
1 | /account/?user=1&tab=groups&group-name=p'+or+'%'='%'+union+all+select+1,2,3,4,5,6,7,8,9,10,11,concat("Database:",database(),0x7c,"Version:",version()),13--+- |
漏洞分析
我们diff一下两个版本,16.26.5与16.26.6
可以在class-rcl-groups-list.php中发现这样一处改变
esc_sql函数就是转义函数
那应该就是group-name参数会造成sql注入,传入的group-name被赋值到了$this->search_name中,看一下这个变量在哪里被使用了,可以找到一个add_query_search_name函数
可以看到定义了一个sql查询语句,并且使用的是LIKE语句,我们再看看add_query_search_name函数在哪里被调用
将add_query_search_name函数添加进了过滤器中,上面提到的这几个漏洞点均在__contruct方法中,并且也都在Rcl_Groups_List类中,于是我们全局搜索一下new Rcl_Groups_List
跟进到这个php文件
rcl_get_grouplist函数被添加进了grouplist标签中,并且该函数中就有我们需要的new Rcl_Groups_List
于是我尝试寻找存在[grouplist]的调用,但没有满意的结果,便继续向上寻找rcl_get_grouplist函数的调用,在wordpress/wp-content/plugins/wp-recall/add-on/groups/index.php中调用了该函数
最后找一下哪里有groups相关的功能就行,在account路由下面发现
传入payload
1 | /account/?user=1&tab=groups&group-name=p'+or+'%'='%'+union+all+select+1,2,3,4,5,6,7,8,9,10,11,concat("Database:",database(),0x7c,"Version:",version()),13--+- |
回显字段数可以通过order by判断
另外,由于add-groups默认为inactive,所以需要到管理员页面开启
还有一个payload
1 | /forum/?fs=.%'+and+if(1=1,'%',1)=' |