찾다
백엔드 개발PHP 튜토리얼CGI 모드에서 PHP를 설치할 때 가능한 공격과 해결 방법

PHP를 서버측 소프트웨어(Apache 등)에 내장하고 모듈로 설치하고 싶지 않은 경우 CGI 모드로 설치하도록 선택할 수 있습니다. 또는 다양한 CGI 래퍼와 함께 PHP를 사용하여 코드에 대한 보안 chroot 및 setuid 환경을 만듭니다. 이 설치 방법은 일반적으로 웹 서버의 cgi-bin 디렉터리에 PHP 실행 파일을 설치합니다. PHP는 독립형 인터프리터로 사용될 수 있지만 다음 유형의 공격에 저항하도록 설계되었습니다.

시스템 파일 액세스: http://my.host/cgi-bin/php?/etc/passwd URL 요청에서 물음표(?) 뒤의 정보는 명명된 줄의 매개변수로 CGI 인터페이스에 전달됩니다. 다른 인터프리터는 명령줄의 첫 번째 인수로 지정된 파일을 열고 실행합니다. 그러나 CGI 모드로 설치된 PHP 인터프리터가 호출되면 이러한 매개변수 해석을 거부합니다.

서버의 모든 디렉터리에 액세스합니다: http://my.host/cgi-bin/php/secret/doc.html 위의 경우 PHP 인터프리터가 있는 디렉터리 뒤에 있는 URL 정보는 다음과 같습니다. /secret/ doc.html은 정기적으로 CGI 프로그램에 전달되어 해석됩니다. 일반적으로 일부 웹 서버는 이를 http://my.host/secret/script.php와 같은 페이지로 리디렉션합니다. 이 경우 일부 서버는 http://my.host/cgi-bin/php/secret/script.php 페이지로의 리디렉션을 생성하기 전에 /secret 디렉토리에 액세스할 수 있는 사용자 권한을 확인합니다. 안타깝게도 많은 서버에서는 /secret/script.php에 대한 사용자의 액세스 권한을 확인하지 않고 /cgi-bin/php의 권한만 확인하므로 /cgi-bin/php에 액세스할 수 있는 모든 사용자가 웹 디렉토리에 액세스할 수 있습니다. 어떤 파일의. PHP에서 컴파일 타임 구성 옵션 --enable-force-cgi-redirect와 런타임 구성 지침 doc_root 및 user_dir은 이러한 공격을 방지하기 위해 서버의 파일 및 디렉터리에 제한을 추가할 수 있습니다. 각 옵션의 설정에 대해서는 아래에서 자세히 설명하겠습니다.

사례 1: 공개 파일만 실행

웹 서버의 모든 콘텐츠가 비밀번호나 IP 주소로 제한되어 있는 경우에는 이 옵션을 설정할 필요가 없습니다. 웹 서버가 리디렉션을 지원하지 않거나 웹 서버가 PHP와 통신하여 액세스 요청을 더욱 안전하게 만들 수 없는 경우 구성 스크립트에서 --enable-force-cgi-redirect 옵션을 지정할 수 있습니다. 또한, PHP 프로그램이 http://my.host/cgi-bin/php/dir/script.php에 직접 접근하거나 리디렉션을 통해 접근하는 등 다른 호출 방식에 의존하지 않는지 확인하는 것도 필요하다. http://my .host/dir/script.php로.

Apache에서는 AddHandler 및 Action 문을 사용하여 리디렉션을 설정할 수 있습니다.

사례 2: --enable-force-cgi-redirect 옵션 사용

이 컴파일 옵션은 누구든지 http://my.host/cgi-bin/php/secretdir A에 액세스하는 것을 방지합니다. /script.php와 같은 URL은 PHP를 직접 호출합니다. 이 모드의 PHP는 웹 서버의 리디렉션 규칙을 통과한 URL만 구문 분석합니다.

일반적으로 Apache의 리디렉션 설정은 다음 명령으로 완료할 수 있습니다.

Action php-script /cgi-bin/php
AddHandler php-script .php

이 옵션은 Apache에서만 테스트되었으며 리디렉션 작업에서 Apache가 설정한 내용에 따라 달라집니다. 표준 CGI 환경 변수 REDIRECT_STATUS. 웹 서버가 요청이 직접인지 리디렉션인지 확인하는 방법을 지원하지 않는 경우 이 옵션을 사용할 수 없으며 다른 방법을 사용해야 합니다.

시나리오 3: doc_root 또는 user_dir 설정

웹 서버의 기본 문서 디렉터리에 스크립트 및 실행 프로그램과 같은 동적 콘텐츠를 포함하는 것은 때때로 안전하지 않은 관행으로 간주됩니다. 구성 오류로 인해 스크립트가 실행되지 않고 일반 HTML 문서로 표시되는 경우 지적 재산이나 비밀번호 정보가 유출될 수 있습니다. 따라서 많은 시스템 관리자는 PHP CGI를 통해서만 액세스할 수 있는 디렉터리를 특별히 설정하여 해당 디렉터리의 내용을 구문 분석만 하고 그대로 표시하지는 않습니다.

위에서 언급한 리디렉션 여부 결정이 불가능한 상황의 경우 기본 문서 디렉토리 외부에 스크립트 전용 doc_root 디렉토리를 생성해야 합니다.

구성 파일의 doc_root를 통해 또는 환경 변수 PHP_DOCUMENT_ROOT를 설정하여 PHP 스크립트 홈 디렉터리를 정의할 수 있습니다. 이 옵션이 설정되면 PHP는 doc_root 디렉토리에 있는 파일만 해석하고 디렉토리 외부의 스크립트는 PHP 인터프리터에 의해 실행되지 않도록 합니다(아래 언급된 user_dir 제외).

사용 가능한 또 다른 옵션은 user_dir입니다. user_dir이 설정되지 않은 경우 doc_root는 파일이 열리는 위치를 제어하는 ​​유일한 옵션입니다. http://my.host/~user/doc.php와 같은 URL에 접속하면 사용자 홈 디렉터리의 파일은 열리지 않고, doc_root 디렉터리의 ~user/doc.php만 실행됩니다. 하위 디렉터리는 시작 부분이 [ ~]로 시작됩니다.

public_php와 같이 user_dir이 설정된 경우 http://my.host/~user/doc.php와 같은 요청은 사용자 홈 디렉터리의 public_php 하위 디렉터리에 있는 doc.php 파일을 실행합니다. 사용자 홈 디렉터리의 절대 경로를 /home/user라고 가정하면, 실행되는 파일은 /home/user/public_php/doc.php가 됩니다.

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

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

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

#!/usr/local/bin/php

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

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


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경