복붙노트

PHP 세션 고정 / 하이재킹

PHP

PHP 세션 고정 / 하이재킹

PHP 세션 고정 및 하이재킹 및 이러한 문제를 방지하는 방법에 대해 자세히 이해하려고합니다. 저는 Chris Shiflett의 웹 사이트에서 다음 두 기사를 읽었습니다.

그러나 나는 올바르게 이해하고 있는지 확신 할 수 없다.

세션 고정을 방지하려면 session_regenerate_id (true)를 호출하면 충분합니다. 누군가를 성공적으로 로깅 한 후에? 나는 그것이 올바르게 이해했다고 생각합니다.

그는 또한 세션 하이재킹을 막기 위해 URL에서 전달 된 토큰을 $ _GET을 통해 사용하는 방법에 대해서도 설명합니다. 이것이 정확히 어떻게 이루어 집니까? 누군가가 자신의 토큰을 생성하여 세션 변수에 저장하고 각 페이지에서 세션 변수와 $ _GET 변수의 값을 비교하면 추측 할 수 있습니다.

이 토큰은 세션 당 또는 페이지로드마다 한 번만 변경해야합니까?

또한 URL에서 값을 전달하지 않고 도용을 방지하는 좋은 방법입니까? 이것은 훨씬 쉬울 것입니다.

해결법

  1. ==============================

    1.좋습니다, 그러나 2 개의 분리되는 그러나 관련 문제가 있고, 각각 다르게 취급됩니다.

    좋습니다, 그러나 2 개의 분리되는 그러나 관련 문제가 있고, 각각 다르게 취급됩니다.

    이것은 공격자가 명시 적으로 사용자 세션의 세션 식별자를 설정하는 곳입니다. 일반적으로 PHP에서는 http://www.example.com/index...?session_name=sessionid와 같은 URL을 제공합니다. 공격자가 클라이언트에게 URL을 제공하면 공격은 세션 하이재킹 공격과 같습니다.

    세션 고정을 방지하는 몇 가지 방법이 있습니다 (모두 수행).

    이것은 공격자가 세션 식별자를 확보하고 해당 사용자 인 것처럼 요청을 보낼 수있는 곳입니다. 즉, 공격자는 식별자를 가지고 있으므로 서버와 관련하여 유효 사용자와 구분할 수 없습니다.

    세션 도용을 직접 방지 할 수 없습니다. 그러나 단계를 거쳐 사용하기가 어렵고 힘들어 질 수 있습니다.

    세션 고정과 하이재킹의 차이점은 세션 식별자가 어떻게 손상되었는지에 관한 것입니다. 고정에서 식별자는 공격자가 미리 알 수있는 값으로 설정됩니다. 하이재킹에서는 사용자가 추측하거나 도난당했습니다. 그렇지 않으면 식별자가 손상되면 두 결과는 동일합니다.

    session_regenerate_id를 사용하여 세션 식별자를 재생성 할 때마다 이전 세션을 삭제해야합니다. 이것은 코어 세션 핸들러에서 투명하게 발생합니다. 그러나 session_set_save_handler ()를 사용하는 일부 사용자 정의 세션 핸들러는이 작업을 수행하지 않고 이전 세션 식별자에 대한 공격에 열려 있습니다. 사용자 지정 세션 처리기를 사용하는 경우 열어 놓은 식별자를 추적하고 이전 식별자를 명시 적으로 삭제 (또는 변경) 한 것과 동일한 식별자가 아닌지 확인하십시오.

    기본 세션 핸들러를 사용하면 session_regenerate_id (true)를 호출하는 것만으로도 충분합니다. 그러면 이전 세션 정보가 삭제됩니다. 이전 ID는 더 이상 유효하지 않으며 공격자 (또는 그와 관련된 다른 사람)가 ID를 사용하려고 시도하면 새 세션이 만들어집니다. 그래도 사용자 지정 세션 처리기를 조심하십시오 ....

    예를 들어 로그 아웃 할 때 세션을 파괴하려면 철저히 파괴해야합니다. 여기에는 쿠키 설정 해제가 포함됩니다. session_destroy 사용 :

    function destroySession() {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
        session_destroy();
    }
    
  2. ==============================

    2.두 세션 공격 모두 동일한 목표를 가지고 있습니다. 다른 사용자의 합법적 인 세션에 대한 액세스 권한을 얻습니다. 그러나 공격 벡터는 다릅니다.

    두 세션 공격 모두 동일한 목표를 가지고 있습니다. 다른 사용자의 합법적 인 세션에 대한 액세스 권한을 얻습니다. 그러나 공격 벡터는 다릅니다.

    두 공격 모두에서 세션 ID는 공격에 집중되는 민감한 데이터입니다. 따라서 세션 ID는 읽기 액세스 (세션 도용)와 쓰기 액세스 (세션 고정) 둘 다에 대해 보호해야합니다.

    이 경우에도 HTTPS를 사용하여 중요한 데이터를 보호하는 일반적인 규칙이 적용됩니다. 또한 다음을 수행해야합니다.

    세션 고정 공격을 방지하려면 다음을 확인하십시오.

    세션 도용 공격을 방지하려면 다음 사항을 확인하십시오.

    두 세션 공격을 방지하려면 다음을 확인하십시오.

  3. ==============================

    3.언급 한 토큰은 한 번 사용 된 "넌센스"입니다. 그것들은 반드시 한 번만 사용해야 할 필요는 없지만 오래 사용될수록 nonce를 캡처하여 세션을 하이재킹 할 확률이 높아집니다.

    언급 한 토큰은 한 번 사용 된 "넌센스"입니다. 그것들은 반드시 한 번만 사용해야 할 필요는 없지만 오래 사용될수록 nonce를 캡처하여 세션을 하이재킹 할 확률이 높아집니다.

    nonces의 또 다른 단점은 그것들을 사용하는 시스템을 구축하는 것이 매우 어렵고 동일한 형태로 여러 개의 병렬 창을 허용한다는 것입니다. 예 : 사용자가 포럼에서 두 개의 창을 열고 두 개의 게시물에 대한 작업을 시작합니다.

    window 'A' loads first and gets nonce 'P'
    window 'B' loads second and gets nonce 'Q'
    

    여러 창을 추적 할 수있는 방법이 없으면 창 B / Q의 비표 만 저장하게됩니다. 그런 다음 사용자가 창 A에서 자신의 게시물을 제출하고 nonce 'P'로 전달하면 시스템은 P! = Q.로 게시물을 거부합니다.

  4. ==============================

    4.나는 Shiflett의 기사를 읽지 않았지만 당신이 뭔가 잘못 이해했다고 생각합니다.

    나는 Shiflett의 기사를 읽지 않았지만 당신이 뭔가 잘못 이해했다고 생각합니다.

    기본적으로 PHP는 클라이언트가 쿠키를 허용하지 않을 때마다 세션 토큰을 URL에 전달합니다. 가장 일반적인 경우에는 세션 토큰이 쿠키로 저장됩니다.

    즉, URL에 세션 토큰을 넣으면 PHP는이를 인식하여 이후에 사용하려고합니다. 세션 고정은 누군가 세션을 생성 한 다음 세션 토큰이 포함 된 URL을 열어 다른 사용자가 동일한 세션을 공유하도록 속일 때 발생합니다. 사용자가 어떤 방식 으로든 인증하면 악의적 인 사용자는 다른 권한을 가진 인증 된 사용자의 세션 토큰을 인식합니다.

    쉬프트 (Shiflett) 씨는 사용자의 권한이 변경 될 때마다 다른 토큰을 재생성하는 것이 일반적이라고 설명합니다.

  5. ==============================

    5.예, 로그인시 세션 ID를 한 번 재생성하여 세션 고정을 방지 할 수 있습니다. 공격자가 새로 인증 된 세션의 쿠키 값을 알지 못하는 경우 이렇게하면됩니다. 문제를 완전히 막는 또 다른 방법은 런타임 구성에서 session.use_only_cookies = True로 설정하는 것입니다. 공격자는 다른 도메인의 컨텍스트에서 쿠키 값을 설정할 수 없습니다. 세션 고정은 쿠키 값을 GET 또는 POST로 보내는 것에 의존합니다.

    예, 로그인시 세션 ID를 한 번 재생성하여 세션 고정을 방지 할 수 있습니다. 공격자가 새로 인증 된 세션의 쿠키 값을 알지 못하는 경우 이렇게하면됩니다. 문제를 완전히 막는 또 다른 방법은 런타임 구성에서 session.use_only_cookies = True로 설정하는 것입니다. 공격자는 다른 도메인의 컨텍스트에서 쿠키 값을 설정할 수 없습니다. 세션 고정은 쿠키 값을 GET 또는 POST로 보내는 것에 의존합니다.

  6. from https://stackoverflow.com/questions/5081025/php-session-fixation-hijacking by cc-by-sa and MIT license