CVE-2023-23488,23489,23490の検証

このブログは、進学して株式会社Armorisに戻ってきたアルバイトのseigo2016が書いています。 あるもりすぶろぐの内容は個人の意見です。

はじめに

検証には自身で管理する環境を使用し、自己責任でお願いします。また、この情報を悪用することは絶対に行わないでください。
今回は2023/01/12に報告された、CVE-2023-23488,23489,23490についての検証を行います。
これらはどれもWordPressプラグインに関する脆弱性で、SQLインジェクションが可能になるものです。
最初にこれら3つのプラグイン脆弱性について簡単にまとめ、今回はその中のPaid Memberships Proプラグインの具体的な検証を行います。

概要 

CVE-2023-23488 (Paid Memberships Pro)

該当プラグイン Paid Memberships Pro
影響を受けるバージョン < 2.9.8
CVSSv3 Score 9.8

バージョン2.9.6で確認しました。

脆弱性の原因

REST API/pmpro/v1/orderエンドポイントのcodeパラメーターをSQLステートメントで使用する際のエスケープがないため、Unauthenticated SQLインジェクションが可能となるものです。

2.9.6

$this->sqlQuery = "SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . $user_id . "' ";

2.9.8(修正版)

$this->sqlQuery = "SELECT id FROM $wpdb->pmpro_membership_orders WHERE user_id = '" . esc_sql( $user_id ) . "' ";

CVE-2023-23489 (Easy Digital Downloads)

該当プラグイン Easy Digital Downloads
影響を受けるバージョン 3.1.0.2, 3.1.0.3
CVSSv3 Score 9.8

バージョン3.1.0.2で確認しました。

脆弱性の原因

edd_download_searchsパラメーターをSQLステートメントで使用する際のエスケープがないため、Unauthenticated SQLインジェクションが可能となるものです。

3.1.0.2

// Get the search string.
$new_search = isset( $_GET['s'] )
    ? sanitize_text_field( $_GET['s'] )
    : '';
(中略)
// Set the local static search variable.
$search['text'] = $new_search;

3.1.0.4(修正版)

// Get the search string.
$new_search = isset( $_GET['s'] )
    ? sanitize_text_field( $_GET['s'] )
    : '';
$new_search = preg_replace( '/[^\pL^\pN\pZ]/', ' ', $new_search );
(中略)
// Set the local static search variable.
$search['text'] = $new_search;

CVE-2023-23490 (Survey Maker)

該当プラグイン Survey Maker
影響を受けるバージョン <= 3.1.2
CVSSv3 Score CVSSv3 Score 8.8

バージョン3.1.0で確認しました。

脆弱性の原因

ays_surveys_export_jsonsurveys_idsパラメータをSQLステートメントで使用する際のエスケープがないため、Authenticated SQLインジェクションが可能となるものです。
認証が必要ですが、管理者権限は不要なため、購読者アカウントで可能です。

3.1.0

public function ays_surveys_export_json() {
    global $wpdb;
    $surveys_ids = isset($_REQUEST['surveys_ids']) ? array_map( 'sanitize_text_field', $_REQUEST['surveys_ids'] ) : array();
    if(empty($surveys_ids)){
        $where = '';
    }else{
        $where = " WHERE id IN (". implode(',', $surveys_ids) .") ";
    }
    (省略)
}

3.1.3(修正版)
ays_surveys_export_json()自体が削除されました。

検証

sqlmapを用いてCVE-2023-23488 (Paid Memberships Pro)の検証を行います。

環境

Name Version
Ubuntu 22.04
WordPress 6.0.1
Paid Memberships Pro 2.9.6

脆弱性を含むバージョンのPaid Memberships Proを有効にします。

1. ダウンロード・展開

  cd /var/www/html/wp-content/plugins/
  wget https://downloads.wordpress.org/plugin/paid-memberships-pro.2.9.6.zip
  unzip paid-memberships-pro.2.9.6.zip

2. メニューから有効化

sqlmapの導入

git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap

検証

今回使用する、sqlmapの代表的なオプションは以下のとおりです。

Option Description
-u 対象とするURL
--dbs データベースの一覧を取得
--tables テーブルの一覧を取得
-D データベースを指定
-T テーブルを指定
--dump データを出力する

まずはデータベースの一覧を取得します。

wordpressユーザーから見ることのできるinformation_schemawordpressデータベースが取得できていることが確認できます。

次に、wordpressデータベースのwp_usersテーブルのデータをを取得します。

wp_userのすべての情報が取得できていることがわかります。

最後に

Paid Memberships Proの該当脆弱性の対応PRで、他にも複数箇所のesc_sqlが追加されていました。
また、2022年末よりWordPressプラグインのSQLiが多く見つかっているようです。参考 意外と大手プラグインでもSQLiに対する関心は薄いのでしょうか。
WordPressプラグインに限らず、ユーザーが任意に入力できるパラメータなどの値をデータベースに渡す場合は、esc_sqlなどで適切にエスケープする必要があります。

このような攻撃から守るために、プラグインのアップデート情報を確認し、アップデートがある場合は検証した上で速やかに更新しましょう。

参考1 CVE-2023-23488: https://www.cve.org/CVERecord?id=CVE-2023-23488
参考2 CVE-2023-23489: https://www.cve.org/CVERecord?id=CVE-2023-23489
参考3 CVE-2023-23490: https://www.cve.org/CVERecord?id=CVE-2023-23490

自分が管理するサーバー以外では絶対に試さないでください。 また、検証は自己責任で行ってください。 この情報を悪用することは絶対に行わないでください。