16-11-2014 / Vulnerabilities

Watu 2.4.9 XSS

Datas from "Open End" questions are not escaped properly (_thecontent() function is used).

File: watu\controllers\show_exam.php

if($ques->answer_type=='textarea' and !empty($_POST["answer-" . $ques->ID][0])) {
	if(!sizeof($all_answers)) $textarea_class = 'correct-answer';
	$result .= wpautop("<li class='user-answer $textarea_class'><span class='answer'><!--WATUEMAIL".$class."WATUEMAIL-->".stripslashes($_POST["answer-" . $ques->ID][0])."</span></li>");
}
$results_output = '<hr />' . apply_filters(WATU_CONTENT_FILTER,$result);
$snapshot = $final_output . $results_output;
$wpdb->query($wpdb->prepare("UPDATE ".WATU_TAKINGS." SET snapshot=%s WHERE ID=%d", $snapshot, $taking_id)); 

XSS is visible for admin.

File: watu\controllers\takings.php

function watu_taking_details() {
	global $wpdb, $user_ID;
	// select taking
	$taking=$wpdb->get_row($wpdb->prepare("SELECT * FROM ".WATU_TAKINGS."
			WHERE id=%d", $_REQUEST['id']));
	// select user
	$student=$wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->users} 
		WHERE id=%d", $taking->user_id));
	// make sure I'm admin or that's me
	if(!current_user_can('manage_options') and $student->ID!=$user_ID) {
		wp_die( __('You do not have sufficient permissions to access this page', 'watu') );
	}
	// select exam
	$exam=$wpdb->get_row($wpdb->prepare("SELECT * FROM ".WATU_EXAMS." WHERE id=%d", $taking->exam_id));
	require(WATU_PATH. '/views/taking_details.html.php');   
	exit;			
}

File: watu\views\taking_details.html.php

<p><?php echo stripslashes($taking->snapshot); ?></p>

Proof of Concept

If exam has at least one "Open End" question it is possible to add XSS there, for example:

<script>alert("XSS");</script>

It will be visible for user after sending form and also for admin:

http://wordpress-instalation/wp-admin/admin.php?page=watu_takings&exam_id=%exam_id%

It must press "view" button, which loads:

http://wordpress-instalation/wp-admin/admin-ajax.php?action=watu_taking_details&id=%result_id%

Timeline

  • 21-10-2014: Discovered
  • 12-11-2014: Vendor notified
  • 12-11-2014: Version 2.5.0.2 released, issue resolved