このブログは、進学して株式会社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_search
のs
パラメーターを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_json
のsurveys_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の導入
脆弱性を含むバージョンの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_schema
とwordpress
データベースが取得できていることが確認できます。
次に、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
自分が管理するサーバー以外では絶対に試さないでください。 また、検証は自己責任で行ってください。 この情報を悪用することは絶対に行わないでください。