Home Backend Development PHP Tutorial Possible attacks and solutions when installing PHP in CGI mode

Possible attacks and solutions when installing PHP in CGI mode

Nov 22, 2016 am 10:51 AM
cgi php

If you don’t want to embed PHP into server-side software (such as Apache) and install it as a module, you can choose to install it in CGI mode. Or use PHP with different CGI wrappers to create secure chroot and setuid environments for your code. This installation method usually installs the PHP executable file into the cgi-bin directory of the web server. Although PHP can be used as a standalone interpreter, its design makes it prevent the following types of attacks:

Accessing system files: http://my.host/cgi-bin/php?/etc/passwd in URL requests The information after the question mark (?) will be passed to the CGI interface as a parameter of the named line. Other interpreters will open and execute the file specified by the first argument on the command line. However, when the PHP interpreter installed in CGI mode is called, it refuses to interpret these parameters.

Access any directory on the server: http://my.host/cgi-bin/php/secret/doc.html In the above case, the URL information /secret/doc.html behind the directory where the PHP interpreter is located will Will be routinely passed to the CGI program and interpreted. Usually some web server will redirect it to a page such as http://my.host/secret/script.php. If this is the case, some servers will check the user's permission to access the /secret directory before creating a redirect to the page at http://my.host/cgi-bin/php/secret/script.php . Unfortunately, many servers do not check the user's permission to access /secret/script.php, but only check the permission of /cgi-bin/php, so that any user who can access /cgi-bin/php can access the web directory of any file. In PHP, the compile-time configuration option --enable-force-cgi-redirect and the run-time configuration instructions doc_root and user_dir can add restrictions to files and directories on the server to prevent such attacks. The settings of each option will be explained in detail below.

Scenario 1: Only run public files

If everything in the web server is restricted by password or IP address, there is no need to set these options. If the web server does not support redirection, or the web server cannot communicate with PHP to make access requests more secure, you can specify the --enable-force-cgi-redirect option in the configure script. In addition, make sure that the PHP program does not rely on other methods of calling, such as direct access to http://my.host/cgi-bin/php/dir/script.php or redirection to access http://my .host/dir/script.php.

In Apache, redirection can be set up using AddHandler and Action statements.

Case 2: Use the --enable-force-cgi-redirect option

This compilation option prevents anyone from directly accessing URLs such as http://my.host/cgi-bin/php/secretdir/script.php Call PHP. PHP in this mode will only parse URLs that have passed the web server's redirect rules.

Usually redirection settings in Apache can be completed with the following command:

Action php-script /cgi-bin/php
AddHandler php-script .php
Copy after login

This option has only been tested under Apache and relies on the non-standard CGI environment variable REDIRECT_STATUS set by Apache in the redirection operation. If the web server does not support any way to determine whether a request is direct or redirected, this option cannot be used and other methods should be used.

Scenario 3: Setting doc_root or user_dir

Including dynamic content such as scripts and executable programs in the main document directory of a web server is sometimes considered an unsafe practice. If the script fails to execute due to a configuration error and is displayed as a normal HTML document, it may lead to the leakage of intellectual property or password information. Therefore, many system administrators will specially set up a directory that can only be accessed through PHP CGI, so that the contents in the directory will only be parsed and not displayed as they are.

For the above-mentioned situation where it is impossible to determine whether to redirect, it is necessary to create a doc_root directory dedicated to scripts outside the main document directory.

You can define the PHP script home directory through doc_root in the configuration file or by setting the environment variable PHP_DOCUMENT_ROOT. If this option is set, PHP will only interpret files in the doc_root directory and ensure that scripts outside the directory will not be executed by the PHP interpreter (except user_dir mentioned below).

Another available option is user_dir. When user_dir is not set, doc_root is the only option that controls where files are opened. When accessing a URL such as http://my.host/~user/doc.php, the file in the user's home directory will not be opened, but only ~user/doc.php in the doc_root directory will be executed (this subdirectory ends with [ ~] as the beginning).

If user_dir is set, such as public_php, then a request like http://my.host/~user/doc.php will execute the doc.php file in the public_php subdirectory under the user's home directory. Assuming that the absolute path of the user's home directory is /home/user, the executed file will be /home/user/public_php/doc.php.

user_dir 的设置与 doc_root 无关,所以可以分别控制 PHP 脚本的主目录和用户目录。

情形四:PHP 解释器放在 web 目录以外

一个非常安全的做法就是把 PHP 解释器放在 web 目录外的地方,比如说 /usr/local/bin。这样做唯一不便的地方就是必须在每一个包含 PHP 代码的文件的第一行加入如下语句:

#!/usr/local/bin/php
Copy after login

还要将这些文件的属性改成可执行。也就是说,要像处理用 Perl 或 sh 或其它任何脚本语言写的 CGI 脚本一样,使用以 #! 开头的 shell-escape 机制来启动它们。

在这种情况下,要使 PHP 能正确处理 PATH_INFO 和 PATH_TRANSLATED 等变量的话,在编译 PHP 解释器时必须加入 --enable-discard-path 参数。


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles