고대의 PHP 소환 HTTP 머리 분사

7325 단어 PHPSecurityhttptech

개시하다


'보안 사이트 제작 방법'에서는 HTTP 머리 분사를 소개했다.이해를 깊게 하기 위해 평소 사용하던 PHP로 동작을 재현하려 했으나 생각만큼 움직이지 못했다.
조사를 해보면 버전 5.1.2가 대책에 의해 현재 유지되고 있는 버전이 재현되지 않는다는 것을 알게 된다.
수정 후 header() 한 번 호출에서 여러 개의 응답 페이지 헤더를 보낼 수 없습니다.
https://www.php.net/releases/5_1_2.php
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년 전이에요.
https://www.php.net/ChangeLog-5.php#5.1.2
본고는 버전 5.1.2 이전의 PHP를 준비하여 HTTP 머리 분사를 재현하였다.
자세한 설명과 대책, 영향 등은 다른 기사에 맡기고 이쪽은 처리하지 않겠습니다.

원래 HTTP 머리 분사란


HTTP 헤드 주사기의 개요는 다음과 같은 페이지 등으로 알기 쉽다.
https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_7.html
https://yamory.io/blog/about-http-header-injection/
HTTP 헤드 주사기의 취약성은 임의의 응답 헤드 필드와 응답체를 만드는 트랩을 설정한 것으로, 이 트랩을 밟은 사용자의 브라우저에 가짜 페이지를 표시하고 스크립트를 실행하며 임의의 쿠키를 저장할 수 있다.
출력을 요청하는 HTTP 응답 헤더에 대한 필드 값은 외부에서 전달되는 매개변수 값 등을 사용하여 동적으로 생성되는 경우가 있습니다.PHP는 헤더 함수를 사용하는 경우죠.
예를 들어 HTTP 리디렉션 실현으로 매개 변수에서 얻은 목적지 이동 URL 정보를 Location 헤더의 필드 값에 사용하는 경우나 게시판 등에 입력한 이름 등을 Set-Cookie 헤더의 필드 값에 사용하는 경우 등을 들 수 있다.
전달된 매개변수를 사용하는 페이지에서 HTTP 응답 헤드의 출력 처리에 문제가 있기 때문입니다.구체적으로 말하면 줄 바꿈 처리입니다.
줄 바꿈 코드는 HTTP 헤더에서 특수 문자에 속합니다.각 HTTP 머리글 행은 줄 바꿈 문자로 구분된 다음 새 머리글 행으로 처리됩니다.줄 바꿈을 삽입할 수 있다면 삽입을 원하지 않는 응답 헤더를 추가할 수 있다는 것이다.

재현해 나가다


고대의 PHP 소환


버전 5.1.2 이전의 PHP 환경을 준비할 때 다음과 같은 Docker 이미지의 도움을 받았습니다.(너무 고마워요.)
https://hub.docker.com/r/nouphet/docker-php4/
환경은 다음과 같습니다.
  • PHP 4.4.0
  • Apache 2.2
  • PHP 4.4.0의 출시는 11 Jul 2005인 것 같습니다.역사가 느껴지네요^^.
    https://www.php.net/ChangeLog-4.php#4.4.0

    정황


    매개변수 값을 기반으로 새 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
    

    데모


    그럼 실제 행동을 살펴봅시다.
    https://youtu.be/eUPzJtFnYFo

    개발자 콘솔에서도 Set-Cookie: PHPSESSID=hogehoge 내용의 응답 헤더를 확인했습니다!!
    이상은 mm입니다.

    참고 자료

  • https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_7.html
  • https://yamory.io/blog/about-http-header-injection/
  • https://blog.tokumaru.org/2015/12/phphttp.html
  • https://yamory.io/blog/about-http-header-injection/
  • 좋은 웹페이지 즐겨찾기