PHP 취약점(8)에 대한 전체 설명 - HTTP 응답 분할

黄舟
풀어 주다: 2023-03-03 21:00:01
원래의
1517명이 탐색했습니다.

HTTP 요청 형식

1) 요청 정보: 예: "Get /index.php HTTP/1.1", 요청 index.php 파일

2) 헤더: 예: "호스트: localhost", 서버 주소

3) 빈 줄

4) 정보 텍스트

"요청 정보"와 "헤더" 모두 줄바꿈 문자( CRLF) 마지막에 빈 줄에는 개행 문자만 포함될 수 있으며 다른 공백은 포함될 수 없습니다.

다음 예에서는 www.yhsafe.com 서버에 HTTP 요청을 보냅니다

GET /index.php HTTP/1.1↙ //정보 요청

Host:www. yhsafe.com ↙ //Header

↙ //빈줄

↙ 기호는 Enter 키를 나타냅니다. HTTP 요청을 보내려면 HTTP 요청 헤더 중 Host 헤더만 필요하고 나머지 HTTP 헤더는 HTTP 요청의 내용에 따라 결정됩니다.

HTTP 요청 방식

1) GET: 응답 요청

2) HEAD: GET과 동일한 응답, 응답 헤더만 필요

3) POST: 처리를 위해 서버로 데이터를 보냅니다. 해당 데이터는 HTTP 메시지 본문에 포함됩니다.

4) PUT: 파일 업로드

5) DELETE: 파일 삭제

6) TRACE: 수신된 요청 추적

7) OPTIONS: 서버가 지원하는 HTTP 요청 방법 반환

8) CONNECT: HTTP 요청 연결을 투명한 TCP /IP로 변환 채널

HTTP 응답 형식

서버는 클라이언트의 HTTP 요청을 처리한 후 다음과 같은 응답을 보냅니다.

1) 첫 번째 줄은 상태 코드입니다

2) 두 번째 줄은 기타 정보로 시작합니다.

상태 코드에는 상태를 식별하는 숫자와 상태를 나타내는 단어가 포함됩니다. 상태를 설명합니다. 예:

HTTP/1.1 200 OK

200은 상태를 식별하는 숫자이고 OK는 상태를 설명하는 단어입니다. 이 상태 코드는 요청이 성공했음을 나타냅니다.

HTTP 요청 및 응답의 예

cmd를 열고 telnet을 입력하고 open www.00aq.com을 입력합니다. 80

연결을 열고

GET을 입력합니다. /index .php HTTP/1.1↙

호스트:www.00aq.com↙

PHP 취약점(8)에 대한 전체 설명 - HTTP 응답 분할

HTTP 응답 헤더 반환

PHP 취약점(8)에 대한 전체 설명 - HTTP 응답 분할

홈페이지 콘텐츠 반환

PHP를 사용하여 HTTP 요청 전송

헤더 기능을 사용하여 HTTP 전송 가능 요청 및 응답 헤더

함수 프로토타입

void header(string string [, bool replacement [, int http_response_code]])

string은 HTTP 헤더의 문자열입니다

replace가 TRUE이면 이전의 유사한 헤더를 현재 헤더로 대체한다는 의미이고, 대체가 FALSE이면 여러 개의 유사한 헤더를 사용한다는 의미입니다. 기본값은 TRUE

http_response_code에 사용됩니다. http_response_code 값을 사용하도록 HTTP 응답 코드

예:

// 인터넷 소켓 연결 열기
$fp = fsockopen(www.00aq.com, 80); > // HTTP 요청 헤더 작성
fputs($fp, "GET / HTTP/1.1rn")
fputs($fp, "Host: www.00aq.comrnrn")
HTTP response string
$http_response = "";
while (!feof($fp))
{
// 256비트 HTTP 응답 문자열 읽기
$http_response. fp, );
}
// 인터넷 소켓 연결 종료
fclose($fp)
// HTTP 응답 정보 표시
echo nl2br(htmlentities($http_response) ; 대상 사용자는 요청을 사용하여 두 개의 응답을 생성합니다. 전자의 응답은 서버의 응답이고 후자는 공격자가 설계한 응답입니다. 이 공격은 웹 프로그램이 사용자 데이터를 HTTP 응답 헤더에 배치하고 이러한 사용자 데이터는 공격자가 신중하게 설계했기 때문에 발생합니다.

HTTP 요청 응답 분할로 인해 발생할 수 있는 기능은 다음과 같습니다.
PHP 취약점(8)에 대한 전체 설명 - HTTP 응답 분할setcookie(); setrawcookie();

HTTP 응답 분할 일반적으로 발생하는 위치는 다음과 같습니다.

위치 헤더: 사용자의 데이터를 리디렉션된 URL 주소에 기록합니다.

Set-Cookie 헤더: 사용자의 데이터를 쿠키에 기록합니다.

예:

header("위치: " . $_GET['page'])

?>

요청

GET /location.php? page=http://www.00aq.com HTTP/1.1↙

호스트: localhost↙


반환

HTTP/1.1 302 발견

날짜: 2010년 1월 13일 수요일 03:44:24 GMT

서버: Apache/2.2.8(Win32) PHP/5.2.6

X-Powered-By: PHP /5.2.6

위치: http://www.00aq.com

콘텐츠 길이: 0

Keep-Alive: 시간 제한=5, 최대=100

연결: Keep-Alive

Content-Type: text/html

아래 링크에 접속하면 로그인 창이 바로 나타납니다

http:// localhost/location.php?page=%0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%20158% 0d%0a%0d%0aAccount%20Password%20

은 읽을 수 있는 문자열로 변환됩니다.

Content-Type: text/html

HTTP/1.1 200 OK

콘텐츠 유형: text/html

콘텐츠 길이: 158


계정
비밀번호

HTTP 요청이 두 개의 응답을 생성했습니다

예방 방법:

1) CRLF 개행 문자 교체

header("Location: " . strtr($_GET[' page'], array ("r"=>"", "n"=>"")));
?>


2) 최신 버전을 사용하세요. PHP

최신 버전의 PHP에서는 더 이상 HTTP 헤더에 개행 문자가 허용되지 않습니다

PHP 취약점(8)에 대한 전체 설명 - HTTP 응답 분할

HTTP 응답 헤더 숨기기

httpd. apache의 conf, 옵션 ServerTokens = Prod, ServerSignature = Off

php의 php.ini, 옵션 hide_php = Off

위는 PHP 취약점(8)-HTTP에 대한 완전한 솔루션입니다. 분할 내용에 대해 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 주목하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿