作者:墨云科技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 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2023/