Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/geo-mashup/geo-mashup-db.php
+++ b/geo-mashup/geo-mashup-db.php
@@ -1495,6 +1495,7 @@
* @param string $name
*/
public static function sanitize_query_arg( &$value, $name ) {
+ if (is_null($value)) return;
switch ($name) {
case 'minlat':
case 'maxlat':
@@ -1507,7 +1508,6 @@
$value = (float) $value;
break;
- case 'map_cat':
case 'object_ids':
case 'exclude_object_ids':
$value = preg_replace( '/[^0-9,]/', '', $value );
@@ -1515,6 +1515,8 @@
case 'map_post_type':
case 'object_name':
+ case 'map_cat':
+ case 'show_future':
$value = sanitize_key( $value );
break;
@@ -1528,10 +1530,6 @@
$value = (bool) $value;
break;
- case 'show_future':
- $value = sanitize_key( $value );
- break;
-
case 'sort':
$value = self::sanitize_sort_arg( $value );
break;
@@ -1635,6 +1633,7 @@
'map_offset' => 0,
);
$query_args = wp_parse_args( $query_args, $default_args );
+ $query_args = self::sanitize_query_args( $query_args );
// Construct the query
$object_name = $query_args['object_name'];
@@ -1745,18 +1744,23 @@
} else {
if ( !is_array( $query_args['map_post_type'] ) )
$query_args['map_post_type'] = preg_split( '/[,s]+/', $query_args['map_post_type'] );
- $wheres[] = "o.post_type IN ('" . join("', '", $query_args['map_post_type']) . "')";
+ $wheres[] = "o.post_type IN ('" . join("', '", array_map( 'esc_sql', $query_args['map_post_type'] ) ) . "')";
}
}
if ( ! empty( $query_args['object_id'] ) ) {
- $wheres[] = 'gmlr.object_id = ' . esc_sql( $query_args['object_id'] );
+ $wheres[] = $wpdb->prepare('gmlr.object_id = %d', absint( $query_args['object_id' ]));
} else if ( ! empty( $query_args['object_ids'] ) ) {
- $wheres[] = 'gmlr.object_id IN ( ' . esc_sql( $query_args['object_ids'] ) .' )';
+ $ids = array_map( 'absint', explode( ',', $query_args['object_ids'] ) );
+ $placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) );
+ $wheres[] = $wpdb->prepare( "gmlr.object_id IN ( $placeholders )", $ids );
}
- if ( ! empty( $query_args['exclude_object_ids'] ) )
- $wheres[] = 'gmlr.object_id NOT IN ( ' . esc_sql( $query_args['exclude_object_ids'] ) . ' )';
+ if ( ! empty( $query_args['exclude_object_ids'] ) ) {
+ $ids = array_map( 'absint', explode( ',', $query_args['exclude_object_ids'] ) );
+ $placeholders = implode( ',', array_fill( 0, count( $ids ), '%d' ) );
+ $wheres[] = $wpdb->prepare( "gmlr.object_id NOT IN ( $placeholders )", $ids );
+ }
list( $l_cols, $l_join, $l_where, $l_groupby ) = $location_query->get_sql( 'o', $object_store['id_column'] );
$field_string .= $l_cols;
--- a/geo-mashup/geo-mashup-options.php
+++ b/geo-mashup/geo-mashup-options.php
@@ -448,7 +448,7 @@
__(', which must be a string', 'GeoMashup') );
return false;
}
- if ( preg_match( "/<.*>/", $value ) ) {
+ if ( preg_match( "/</?[a-z][a-z0-9]*/i", $value ) ) {
array_push ( $this->validation_errors, '"'. esc_html( $value ) . '" ' . __('is invalid for', 'GeoMashup') . ' ' . $key .
__(', which must not contain XML tags.', 'GeoMashup') );
return false;
--- a/geo-mashup/geo-mashup.php
+++ b/geo-mashup/geo-mashup.php
@@ -3,7 +3,7 @@
Plugin Name: Geo Mashup
Plugin URI: https://wordpress.org/plugins/geo-mashup/
Description: Save location for posts and pages, or even users and comments. Display these locations on Google, Leaflet, and OSM maps. Make WordPress into your GeoCMS.
-Version: 1.13.18
+Version: 1.13.19
Author: Dylan Kuhn
Text Domain: GeoMashup
Domain Path: /lang
@@ -256,7 +256,7 @@
define('GEO_MASHUP_DIRECTORY', dirname( GEO_MASHUP_PLUGIN_NAME ) );
define('GEO_MASHUP_URL_PATH', trim( plugin_dir_url( __FILE__ ), '/' ) );
define('GEO_MASHUP_MAX_ZOOM', 20);
- define('GEO_MASHUP_VERSION', '1.13.18');
+ define('GEO_MASHUP_VERSION', '1.13.19');
define('GEO_MASHUP_DB_VERSION', '1.3');
}
@@ -1113,6 +1113,9 @@
*/
private static function click_to_load_content( $map_data, $iframe_src, $click_to_load_text, $static, $map_image ) {
+ $iframe_src = esc_attr( $iframe_src );
+ $click_to_load_text = esc_html( $click_to_load_text );
+
if ( is_feed() ) {
return "<a href="{$iframe_src}">$click_to_load_text</a>";
}
@@ -1621,6 +1624,8 @@
);
$args = wp_parse_args( $args, $defaults );
extract( $args, EXTR_SKIP );
+ $separator = esc_html( $separator );
+ $format = esc_html( $format );
$info = '';
if ( $object_name && $object_id ) {
--- a/geo-mashup/geo-query.php
+++ b/geo-mashup/geo-query.php
@@ -269,7 +269,7 @@
header('Cache-Control: no-cache;', true);
header('Expires: -1;', true);
- $json = GeoMashup::get_locations_json( GeoMashupDB::sanitize_query_args( $_REQUEST ) );
+ $json = GeoMashup::get_locations_json( $_REQUEST );
if ( isset( $_REQUEST['callback'] ) )
$json = esc_js( $_REQUEST['callback'] ) . '(' . $json . ')';
echo $json;
--- a/geo-mashup/php/Admin/Settings/OptionsPage.php
+++ b/geo-mashup/php/Admin/Settings/OptionsPage.php
@@ -86,6 +86,10 @@
check_admin_referer( 'geo-mashup-update-options' );
+ if ( ! current_user_can( 'manage_options' ) ) {
+ wp_die( 'Not Authorized' );
+ }
+
// Make missing array options empty
if ( empty( $submission['global_map']['add_map_type_control'] ) ) {
$submission['global_map']['add_map_type_control'] = array();
--- a/geo-mashup/php/Search.php
+++ b/geo-mashup/php/Search.php
@@ -174,19 +174,18 @@
public function load_template( $template = 'search-results' ) {
// Define variables for the template
- /** @var $object_name */
- /** @var $object_ids */
- /** @var $units */
- /** @var $location_text */
- /** @var $radius */
- /** @var $sort */
- extract( $this->query_vars, EXTR_OVERWRITE );
+ $object_name = isset($this->query_vars['object_name']) ? $this->query_vars['object_name'] : null;
+ $distance_factor = isset($this->query_vars['distance_factor']) ? $this->query_vars['distance_factor'] : null;
+ $units = isset($this->query_vars['units']) ? $this->query_vars['units'] : null;
+ $location_text = isset($this->query_vars['location_text']) ? $this->query_vars['location_text'] : null;
+ $radius = isset($this->query_vars['radius']) ? $this->query_vars['radius'] : null;
+ $sort = isset($this->query_vars['sort']) ? $this->query_vars['sort'] : null;
extract( [
- 'search_text' => $location_text,
+ 'search_text' => esc_html( $location_text ),
'distance_factor' => $this->distance_factor,
'near_location' => $this->near_location,
- 'result_count' => $this->result_count,
+ 'result_count' => (int) $this->result_count,
'geo_mashup_search' => &$this,
'approximate_zoom' => absint( log( 10000 / $this->max_km, 2 ) )
], EXTR_OVERWRITE );
--- a/geo-mashup/vendor/composer/installed.php
+++ b/geo-mashup/vendor/composer/installed.php
@@ -1,9 +1,9 @@
<?php return array(
'root' => array(
'name' => 'cyberhobo/wordpress-geo-mashup',
- 'pretty_version' => '1.13.18',
- 'version' => '1.13.18.0',
- 'reference' => '9305999a20b89e7ac45e070acf55cb709112103d',
+ 'pretty_version' => '1.13.19',
+ 'version' => '1.13.19.0',
+ 'reference' => 'dc9a83950897592ee664acc7dea71600e68ea932',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -11,9 +11,9 @@
),
'versions' => array(
'cyberhobo/wordpress-geo-mashup' => array(
- 'pretty_version' => '1.13.18',
- 'version' => '1.13.18.0',
- 'reference' => '9305999a20b89e7ac45e070acf55cb709112103d',
+ 'pretty_version' => '1.13.19',
+ 'version' => '1.13.19.0',
+ 'reference' => 'dc9a83950897592ee664acc7dea71600e68ea932',
'type' => 'wordpress-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),