Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/buddypress-media/app/helper/RTMediaModel.php
+++ b/buddypress-media/app/helper/RTMediaModel.php
@@ -122,19 +122,17 @@
$qgroup_by = ' ';
$allowed_order_columns = array( 'media_id', 'media_title', 'file_size' ); // Define allowed columns.
+ $allowed_order_dirs = array( 'asc', 'desc', '' );
list( $order_column, $order_direction ) = explode( ' ', $order_by . ' ' ); // Default to space if no direction provided.
- if ( ! in_array( strtolower( $order_column ), $allowed_order_columns ) || ! in_array(
- strtolower( $order_direction ),
- array(
- 'asc',
- 'desc',
- '',
- )
- ) ) {
- $order_by = 'media_id desc'; // Default order.
+ if ( ! in_array( strtolower( $order_column ), $allowed_order_columns, true ) || ! in_array( strtolower( $order_direction ), $allowed_order_dirs, true ) ) {
+ $order_column = 'media_id';
+ $order_direction = 'desc';
}
+ // Reconstruct order_by from validated tokens only to prevent injection via trailing content.
+ $order_by = trim( $order_column . ' ' . $order_direction );
+
if ( $order_by ) {
$order_by = esc_sql( $order_by );
$qorder_by = " ORDER BY {$this->table_name}.{$order_by}";
--- a/buddypress-media/app/main/controllers/template/rtmedia-filters.php
+++ b/buddypress-media/app/main/controllers/template/rtmedia-filters.php
@@ -747,13 +747,15 @@
if ( function_exists( 'rtmedia_media_search_enabled' ) && rtmedia_media_search_enabled() ) {
+ global $wpdb;
+
$raw_search = wp_unslash( filter_input( INPUT_GET, 'search', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) );
- if ( 'string' !== gettype( $raw_search ) ) {
+ if ( ! is_string( $raw_search ) ) {
$raw_search = '';
}
- $search = sanitize_text_field( urldecode( $raw_search ) );
+ $search = sanitize_text_field( $raw_search );
$search_by = sanitize_text_field( wp_unslash( filter_input( INPUT_GET, 'search_by', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ) );
$media_type = sanitize_text_field( wp_unslash( filter_input( INPUT_GET, 'media_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ) );
$rtmedia_current_album = sanitize_text_field( wp_unslash( filter_input( INPUT_GET, 'rtmedia-current-album', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ) );
@@ -762,6 +764,9 @@
$author_id = rtm_select_user( $search );
$member_type = rtm_fetch_user_by_member_type( $search );
+ $author_id = implode( ',', array_map( 'absint', array_filter( explode( ',', $author_id ) ) ) );
+ $member_type = implode( ',', array_map( 'absint', array_filter( explode( ',', $member_type ) ) ) );
+
if ( ! empty( $rtmedia_current_album ) ) {
$where = '';
}
@@ -770,17 +775,17 @@
if ( ! empty( $search_by ) ) {
if ( ! empty( $rtmedia_current_album ) ) {
- $where .= " $table_name.album_id = '" . $rtmedia_current_album . "' AND ";
+ $where .= $wpdb->prepare( " $table_name.album_id = %d AND ", absint( $rtmedia_current_album ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
if ( ! empty( $media_type ) && empty( $rtmedia_current_album ) ) {
- $where .= " $table_name.media_type = '" . $media_type . "' AND ";
+ $where .= $wpdb->prepare( " $table_name.media_type = %s AND ", $media_type ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
if ( 'title' === $search_by ) {
- $where .= " $table_name.media_title LIKE '%" . $search . "%' ";
+ $where .= $wpdb->prepare( " $table_name.media_title LIKE %s ", '%' . $wpdb->esc_like( $search ) . '%' ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
} elseif ( 'description' === $search_by ) {
- $where .= " post_table.post_content LIKE '%" . $search . "%'";
+ $where .= $wpdb->prepare( " post_table.post_content LIKE %s ", '%' . $wpdb->esc_like( $search ) . '%' );
} elseif ( 'author' === $search_by ) {
if ( ! empty( $author_id ) ) {
@@ -796,24 +801,24 @@
} else {
if ( ! empty( $rtmedia_current_album ) ) {
- $where .= " $table_name.album_id = '" . $rtmedia_current_album . "' AND ";
+ $where .= $wpdb->prepare( " $table_name.album_id = %d AND ", absint( $rtmedia_current_album ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
if ( ! empty( $media_type ) && empty( $rtmedia_current_album ) ) {
- $where .= " $table_name.media_type = '" . $media_type . "' AND ";
+ $where .= $wpdb->prepare( " $table_name.media_type = %s AND ", $media_type ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
$where .= ' ( ';
- $where .= " $table_name.media_title LIKE '%" . $search . "%' ";
+ $where .= $wpdb->prepare( " $table_name.media_title LIKE %s ", '%' . $wpdb->esc_like( $search ) . '%' ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
if ( ! empty( $author_id ) ) {
$where .= " OR $table_name.media_author IN (" . $author_id . ') ';
}
if ( ! empty( $member_type ) ) {
$where .= " OR $table_name.media_author IN (" . $member_type . ') ';
}
- $where .= " OR post_table.post_content LIKE '%" . $search . "%'";
+ $where .= $wpdb->prepare( " OR post_table.post_content LIKE %s ", '%' . $wpdb->esc_like( $search ) . '%' );
if ( empty( $media_type ) ) {
- $where .= " OR $table_name.media_type = '" . $search . "' ";
+ $where .= $wpdb->prepare( " OR $table_name.media_type = %s ", $search ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
$where .= ' ) ';
@@ -822,12 +827,12 @@
// Reset data for album's media.
if ( '' !== $search && ! empty( $rtmedia_current_album ) ) {
- $where .= " AND $table_name.album_id = '" . $rtmedia_current_album . "' ";
+ $where .= $wpdb->prepare( " AND $table_name.album_id = %d ", absint( $rtmedia_current_album ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
// Reset data for particular media type.
if ( ! empty( $media_type ) && empty( $rtmedia_current_album ) ) {
- $where .= " AND $table_name.media_type = '" . $media_type . "' ";
+ $where .= $wpdb->prepare( " AND $table_name.media_type = %s ", $media_type ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
} // End if.
} // End if.
@@ -871,10 +876,14 @@
$request_uri = rtm_get_server_var( 'REQUEST_URI', 'FILTER_SANITIZE_URL' );
$request_url = explode( '/', $request_uri );
if ( ! empty( $search_by ) && 'attribute' === $search_by && ! in_array( 'attribute', $request_url, true ) ) {
- $join .= " INNER JOIN $posts_table ON ( $posts_table.ID = $table_name.media_id AND $posts_table.post_type = '$media_type' )
- INNER JOIN $terms_table ON ( $terms_table.slug IN ('" . $search . "') )
+ $join .= $wpdb->prepare(
+ " INNER JOIN $posts_table ON ( $posts_table.ID = $table_name.media_id AND $posts_table.post_type = %s )
+ INNER JOIN $terms_table ON ( $terms_table.slug = %s )
INNER JOIN $term_taxonomy_table ON ( $term_taxonomy_table.term_id = $terms_table.term_id )
- INNER JOIN $term_relationships_table ON ( $term_relationships_table.term_taxonomy_id = $term_taxonomy_table.term_taxonomy_id AND $term_relationships_table.object_id = $posts_table.ID ) ";
+ INNER JOIN $term_relationships_table ON ( $term_relationships_table.term_taxonomy_id = $term_taxonomy_table.term_taxonomy_id AND $term_relationships_table.object_id = $posts_table.ID ) ",
+ $media_type,
+ $search
+ ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Interpolated values are trusted internal table/column identifiers, not user input.
}
}
}
--- a/buddypress-media/app/main/controllers/template/rtmedia-functions.php
+++ b/buddypress-media/app/main/controllers/template/rtmedia-functions.php
@@ -4324,7 +4324,7 @@
}
}
- $user_id = implode( ',', $user_ids );
+ $user_id = implode( ',', array_map( 'absint', $user_ids ) );
return $user_id;
}
@@ -4357,7 +4357,7 @@
array_push( $member_id, bp_get_member_user_id() );
}
}
- $member_id = implode( ',', $member_id );
+ $member_id = implode( ',', array_map( 'absint', $member_id ) );
}
return $member_id;
--- a/buddypress-media/index.php
+++ b/buddypress-media/index.php
@@ -3,7 +3,7 @@
* Plugin Name: rtMedia for WordPress, BuddyPress and bbPress
* Plugin URI: https://rtmedia.io/?utm_source=dashboard&utm_medium=plugin&utm_campaign=buddypress-media
* Description: This plugin adds missing media rich features like photos, videos and audio uploading to BuddyPress which are essential if you are building social network, seriously!
- * Version: 4.7.10
+ * Version: 4.7.11
* Requires at least: 4.1
* Text Domain: buddypress-media
* Author: rtCamp
@@ -22,7 +22,7 @@
/**
* The version of the plugin
*/
- define( 'RTMEDIA_VERSION', '4.7.10' );
+ define( 'RTMEDIA_VERSION', '4.7.11' );
}
if ( ! defined( 'RTMEDIA_PATH' ) ) {