고대의 PHP 소환 HTTP 머리 분사
개시하다
'보안 사이트 제작 방법'에서는 HTTP 머리 분사를 소개했다.이해를 깊게 하기 위해 평소 사용하던 PHP로 동작을 재현하려 했으나 생각만큼 움직이지 못했다.
조사를 해보면 버전 5.1.2가 대책에 의해 현재 유지되고 있는 버전이 재현되지 않는다는 것을 알게 된다.
수정 후 header() 한 번 호출에서 여러 개의 응답 페이지 헤더를 보낼 수 없습니다.
HTTP Response Splitting has been addressed in ext/session and in the header() function. Header() can no longer be used to send multiple response headers in a single call.
그나저나 첫 발매가
12 Jan 2006
라서 15년 전이에요.본고는 버전 5.1.2 이전의 PHP를 준비하여 HTTP 머리 분사를 재현하였다.
자세한 설명과 대책, 영향 등은 다른 기사에 맡기고 이쪽은 처리하지 않겠습니다.
원래 HTTP 머리 분사란
HTTP 헤드 주사기의 개요는 다음과 같은 페이지 등으로 알기 쉽다.
HTTP 헤드 주사기의 취약성은 임의의 응답 헤드 필드와 응답체를 만드는 트랩을 설정한 것으로, 이 트랩을 밟은 사용자의 브라우저에 가짜 페이지를 표시하고 스크립트를 실행하며 임의의 쿠키를 저장할 수 있다.
출력을 요청하는 HTTP 응답 헤더에 대한 필드 값은 외부에서 전달되는 매개변수 값 등을 사용하여 동적으로 생성되는 경우가 있습니다.PHP는 헤더 함수를 사용하는 경우죠.
예를 들어 HTTP 리디렉션 실현으로 매개 변수에서 얻은 목적지 이동 URL 정보를 Location 헤더의 필드 값에 사용하는 경우나 게시판 등에 입력한 이름 등을 Set-Cookie 헤더의 필드 값에 사용하는 경우 등을 들 수 있다.
전달된 매개변수를 사용하는 페이지에서 HTTP 응답 헤드의 출력 처리에 문제가 있기 때문입니다.구체적으로 말하면 줄 바꿈 처리입니다.
줄 바꿈 코드는 HTTP 헤더에서 특수 문자에 속합니다.각 HTTP 머리글 행은 줄 바꿈 문자로 구분된 다음 새 머리글 행으로 처리됩니다.줄 바꿈을 삽입할 수 있다면 삽입을 원하지 않는 응답 헤더를 추가할 수 있다는 것이다.
재현해 나가다
고대의 PHP 소환
버전 5.1.2 이전의 PHP 환경을 준비할 때 다음과 같은 Docker 이미지의 도움을 받았습니다.(너무 고마워요.)
환경은 다음과 같습니다.
11 Jul 2005
인 것 같습니다.역사가 느껴지네요^^.정황
매개변수 값을 기반으로 새 URL로 리디렉션한다고 가정합니다.
예를 들어 방문
http://localhost?url=sample.html
하면http://localhost/sample.html
이 이런 방법으로 바뀌었다.상기 내용을 바탕으로 문서 루트 아래에 다음과 같은 파일을 설정합니다.
index.php
<?php
if(isset($_GET['url'])){
header('Location: ' . $_GET['url']);
}
?>
<div>Render Cookies</div>
<?php
if (isset($_COOKIE)){
echo('<pre>');
var_dump($_COOKIE);
echo('</pre>');
}
?>
header('Location: ' . $_GET['url']);
, 헤더()에 설정'Location
을 통해 방향을 바꿨습니다.(이 상황도 개방이 방향을 바꾸는 취약성을 포함하고 있다...)
방법
Set-Cookie
Henspons Header를 추가하여 쿠키를 설정합니다.이렇게 하려면 다음 URL을 방문하십시오.
http://localhost/?url=http://localhost/%0d%0aSet-Cookie:+PHPSESSID%3Dhogehoge
방문 후 %0d%0a
다른 줄로 읽고 추가한 HTTP 응답 헤더는 다음과 같이 쿠키를 덮어쓸 수 있습니다.Location: http://localhost
Set-Cookie: PHPSESSID=hogehoge
데모
그럼 실제 행동을 살펴봅시다.
개발자 콘솔에서도
Set-Cookie: PHPSESSID=hogehoge
내용의 응답 헤더를 확인했습니다!!이상은 mm입니다.
참고 자료
Reference
이 문제에 관하여(고대의 PHP 소환 HTTP 머리 분사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/shlia/articles/f446bde2b7594a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)