LimeSurvey is an open source and commercial web application written in PHP that enables its users to quickly design and setup scalable surveys. Last year, we scanned the at that time latest version 2.72.3 with our static code analysis tool RIPS. In this technical post we will discuss and present two of the automatically detected vulnerabilities in 1MLOC: An unauthenticated persistent cross-site scripting vulnerability in the continue later feature and an authenticated arbitrary file write vulnerability. Both vulnerabilities can be chained by an attacker in order to execute code on the targeted web server with only one payload.
LimeSurvey 2.72.3 is prone to a persistent cross-site scripting vulnerability which is exploitable through the unauthenticated perspective. When submitting a public survey, the Continue Later
feature allows users to save their partially completed survey repose and reload it at a later time. In order to identify the returning user, he provides an email address and a password when saving his response. This email address is persistently displayed unsanitized in the admin panel’s HTML context allowing the execution of malicious JavaScript.
|
|
The JavaScript is executed in the browser of an authenticated victim who is visiting a specially crafted link or who is viewing the partially saved repose data in the administrator’s control panel. Through this vulnerability the attacker can perform actions in the name of the victim and therefore gains access to the authenticated perspective of the web application which allows the adversary to leverage the next vulnerability.
The exploitation of this vulnerability is only possible if the attacker can read, update and import templates1. The attacker imports a new template by uploading a zip file containing a single config.xml
file. The XML file specifies the path of the file to be modified:
|
|
In this particular example the attacker modifies the index.php
file of the LimeSurvey web root by using the built-in template file editor. This is possible because the web application does not properly sanitize the filenames which are passed within the <files_editable>
-tag. Therefore a path traversal attack will mislead the application logic to treat the index.php
of the web root as an editable file of the template. The following method templatesave_changes()
is invoked when processing modifications to the template through the built-in template editor.
|
|
On line 610
the new content of the file is received through the parameter changes
. The variable $editfile
holds the name of the file and is received on line 616
. The if
statement ranging from line 622
to line 624
is the only check to prevent an attacker from changing files which are not part of the template. By previously importing the malicious template, the array $cssfiles
will contain the file index.php
causing the check to complete successfully and the file is finally opened and written to on line 633
and 637
respectively.
Date | What |
---|---|
2017/11/08 | Provided vulnerability details and PoC to vendor |
2017/11/08 | Vendor acknowledged and fixes cross-site scripting |
2017/11/10 | Fixed version released |
The vulnerability chaining in LimeSurvey 2.72.3 yields a single final exploit which would add malicious JavaScript code to the admin panel through the Continue Later
functionality of a public survey. As soon as the JavaScript payload is executed in the administrator context it can exploit the arbitrary file write vulnerability to give the adversary persistent shell access to the operating system remotely to maximize impact. Our proof of concept has shown that an unauthenticated attacker can chain multiple vulnerabilities to gain access to the remote system without user interaction. We thank LimeSurvey for the very fast reaction and patch and highly recommend to update to the latest version 3.