作者:墨云科技VLab Team
原文链接:https://mp.weixin.qq.com/s/mlLVIVM4bpQbOV8dVXaJSA

图片

漏洞简述

WooCommerce 一款基于 WordPress 的开源电子商务插件。时至今日已变成全球最流行的电商系统,它是为使用WordPress的小型或大型在线商人而设计的。该插件于2011年9月27日发布,以其易于安装和定制以及免费的基础产品而迅速流行。WooCommerce在WordPress拥有5百万+的用户量。

漏洞分析

根据官方发布的安全更新通告来看,该漏洞影响了大概90多个版本的插件,然后去官方源码库查看代码提交记录,发现在

woocommerce/tags/5.3.1/packages/woocommerce-blocks/src/StoreApi/Utilities/ProductQueryFilters.php

存在sql注入点,在修复后,会调用

wc_sanitize_taxonomy_name

以及

esc_sql

来防止注入。

图片

根据该文件的路径去反向推一下访问地址,首先全局搜索该逻辑所在的函数名

get_attribute_counts

在哪里进行了调用。

图片

然后打开该文件

wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Routes/ProductCollectionData.php

发现当前文件中有

get_path()

方法,其所对应的就是接口的访问路径,然后拼接到url中即可,最终该文件的访问地址为:

http://wp.local:8888/wp-json/wc/store/products/collection-data

接着继续找漏洞调用点

get_attribute_counts

在哪里进行了调用,发现在

get_route_response

中对该漏洞函数进行了调用。

图片

根据阅读代码发现,需要给定相对应的请求参数

calculate_attribute_counts

才会进入该判断,根据在

get_collection_params

中对

calculate_attribute_counts

参数的定义,可以直接反推出来访问的地址:

图片

可以看到其接收的参数类型为数组类型,直接在上面反推出来的当前文件访问地址后面加数组访问参数即可给

 $request['calculate_attribute_counts']

赋值.

http://wp.local:8888/wp-json/wc/store/products/collection-data?calculate_attribute_counts[][taxonomy]=product_type

接下来就是构造poc了,在对官方修复的文件中的86行进行深入分析,

wp-content/plugins/woocommerce/packages/woocommerce-blocks/src/StoreApi/Utilities/ProductQueryFilters.php

对其调用的

wc_sanitize_taxonomy_name

函数进行查找,全局搜索发现存在的位置为:

wp-content/plugins/woocommerce/includes/wc-formatting-functions.php

其内容为:

/**
 * Sanitize taxonomy names. Slug format (no spaces, lowercase).
 * Urldecode is used to reverse munging of UTF8 characters.
 *
 * @param string $taxonomy Taxonomy name.
 * @return string
 */
function wc_sanitize_taxonomy_name( $taxonomy ) {
    return apply_filters( 'sanitize_taxonomy_name', urldecode( sanitize_title( urldecode( $taxonomy ) ) ), $taxonomy );
}

可以看到其返回的结果的核心是调用

sanitize_title

方法,该方法在官方解释如下,

图片

在返回结果后,并未对结果进行二次处理,在下面直接调用sql语句拼接了进去,

图片

发现其最终导致的问题点,其根本原因是自行封装的函数只调用了

sanitize_title

函数,该函数虽然能过滤一些字符,但是对于最终查询sql语句之前却未调用

esc_sql

函数,从而导致SQL注入。

图片

时间线

  • 2021年7月13日WooCommerce接收到漏洞报送
  • 2021年7月14日WooCommerce修复该漏洞
  • 2021年7月15日WooCommerce官方发布文章通告
  • 2021年7月15日VLab实验室监测到漏洞通告
  • 2021年7月16日VLab实验室完成该漏洞复现

影响版本

  • WooCommerce(3.3-5.5.0)
  • WooCommerce Blocks(2.5-5.5.0)

修复建议

登录WordPress后台,将相关插件更新至最新版。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/2023/