>백엔드 개발 >PHP 튜토리얼 >PHP 보안 - 세션 하이재킹

PHP 보안 - 세션 하이재킹

黄舟
黄舟원래의
2017-02-21 09:20:461896검색



세션 하이재킹

세션에 대한 가장 일반적인 공격 방법은 세션 하이재킹입니다. 이는 공격자가 다른 사람의 세션에 액세스하기 위해 사용할 수 있는 모든 수단을 가리키는 일반적인 용어입니다. 이 모든 방법의 첫 번째 단계는 합법적인 세션 ID를 얻어 합법적인 사용자인 척하는 것이므로 세션 ID가 유출되지 않도록 하는 것이 매우 중요합니다. 이전 섹션의 세션 노출 및 고정에 대한 지식은 세션 식별자가 서버와 합법적인 사용자에게만 알려지도록 하는 데 도움이 될 수 있습니다.

심층 방어 원칙(1장 참조)이 세션에 적용될 수 있습니다. 불행하게도 세션 식별자가 공격자에게 알려지면 눈에 띄지 않는 일부 보안 조치도 어느 정도 보호를 제공합니다. 보안에 관심이 있는 개발자로서 귀하의 목표는 앞서 언급한 위장 프로세스를 더욱 정교하게 만드는 것입니다. 장애물이 아무리 작더라도 애플리케이션이 보호 기능을 제공한다는 점을 기억하십시오.

변장 과정을 더욱 복잡하게 만드는 핵심은 검증 강화다. 세션 ID는 기본 인증 방법이지만 다른 데이터로 보완할 수 있습니다. 사용할 수 있는 모든 데이터는 각 HTTP 요청의 데이터입니다.

 GET / HTTP/1.1
  Host: example.org
  User-Agent: Firefox/1.0
  Accept: text/html, image/png, image/jpeg,
image/gif, */*
  Cookie: PHPSESSID=1234


요청 일관성을 인지하고 일관성 없는 동작을 의심스러운 것으로 간주해야 합니다. 예를 들어 User-Agent(이 요청을 발행한 브라우저 유형) 헤더는 선택사항이지만 헤더를 발행하는 브라우저는 일반적으로 해당 값을 변경하지 않습니다. 세션ID가 1234인 사용자가 로그인 후 Mozilla를 사용하고 있는 경우 Firefox 브라우저가 갑자기 IE로 전환되었는데, 이는 더욱 의심스럽습니다. 예를 들어, 이때 비밀번호를 요구하여 위험을 완화할 수 있으며, 동시에 잘못된 경보가 발생하는 경우 합법적인 사용자에게 미치는 영향이 줄어듭니다. 다음 코드를 사용하여 사용자-에이전트 일관성을 확인할 수 있습니다.

 <?php
 
  session_start();
 
  if (isset($_SESSION[&#39;HTTP_USER_AGENT&#39;]))
  {
    if ($_SESSION[&#39;HTTP_USER_AGENT&#39;] !=
md5($_SERVER[&#39;HTTP_USER_AGENT&#39;]))
    {
      /* Prompt for password */
      exit;
    }
  }
  else
  {
    $_SESSION[&#39;HTTP_USER_AGENT&#39;] =
md5($_SERVER[&#39;HTTP_USER_AGENT&#39;]);
  }
 
  ?>


IE 브라우저의 일부 버전에서는 사용자가 정상적으로 웹 페이지에 액세스하고 웹 페이지를 새로 고칠 때 발행되는 Accept 헤더 정보가 다르기 때문에 Accept 헤더를 사용하여 일관성을 확인할 수 없는 것을 확인했습니다.

User-Agent 헤더 정보의 일관성을 보장하는 것은 실제로 효과적이지만 세션 식별자가 쿠키(권장 방법)를 통해 전달되는 경우 공격자가 세션 식별자를 얻을 수 있다면 세션 식별자도 얻을 수 있다는 것이 합리적입니다. 다른 HTTP 헤더. 쿠키 노출은 브라우저 취약점이나 크로스 사이트 스크립팅 취약점과 관련이 있기 때문에 피해자는 공격자의 웹사이트를 방문하여 모든 헤더 정보를 노출해야 합니다. 공격자가 해야 할 일은 헤더 정보의 일관성 검사를 방지하기 위해 헤더를 재구성하는 것뿐입니다.

더 나은 접근 방식은 URL에 태그를 전달하는 것입니다. 이는 비록 약하기는 하지만 두 번째 검증 형식으로 생각할 수 있습니다. 이 방법을 사용하려면 약간의 프로그래밍 작업이 필요하며 PHP에는 해당 기능이 없습니다. 예를 들어 토큰이 $token에 저장되어 있다고 가정하면 앱의 모든 내부 링크에 이를 포함해야 합니다.

  <?php
 
  $url = array();
  $html = array();
 
  $url[&#39;token&#39;] = rawurlencode($token);
  $html[&#39;token&#39;] = htmlentities($url[&#39;token&#39;],
ENT_QUOTES, &#39;UTF-8&#39;);
 
  ?>
 
  <a href="index.php?token=<?php echo
$html[&#39;token&#39;]; ?>">Click Here</a>


이 배달 프로세스를 더 쉽게 관리하려면 전체 요청 문자열을 변수에 넣을 수 있습니다. 이 변수를 모든 링크에 추가하면 처음에 이 기술을 사용하지 않더라도 나중에 코드를 쉽게 변경할 수 있습니다.

공격자가 피해자의 브라우저에서 전송한 모든 HTTP 헤더를 알고 있더라도 태그에는 예측할 수 없는 콘텐츠가 포함되어야 합니다. 한 가지 방법은 임의의 문자열을 토큰으로 생성하는 것입니다.

<?php
 
  $string = $_SERVER[&#39;HTTP_USER_AGENT&#39;];
  $string .= &#39;SHIFLETT&#39;;
 
  $token = md5($string);
  $_SESSION[&#39;token&#39;] = $token;
 
  ?>


임의의 문자열(예: SHIFLETT)을 사용하는 경우 이를 예측하는 것은 비현실적입니다. 이때 태그를 예측하는 것보다 태그를 캡처하는 것이 더 편리할 것입니다. URL에 태그를 전달하고 쿠키에 세션 ID를 전달함으로써 공격은 두 가지를 동시에 캡처해야 합니다. 공격자가 피해자가 애플리케이션에 보낸 모든 HTTP 요청의 원시 정보를 볼 수 없는 경우에는 모든 것이 노출되기 때문입니다. 이 공격은 구현하기가 매우 어렵고(따라서 드물기 때문에) 이를 방지하려면 SSL을 사용해야 합니다.

  有专家警告不要依赖于检查User-Agent的一致性。这是因为服务器群集中的HTTP代理服务器会对User-Agent进行编辑,而本群集中的多个代理服务器在编辑该值时可能会不一致。

  如果你不希望依赖于检查User-Agent的一致性。你可以生成一个随机的标记:

 

  <?php
 
  $token = md5(uniqid(rand(), TRUE));
  $_SESSION[&#39;token&#39;] = $token;
 
  ?>

  这一方法的安全性虽然是弱一些,但它更可靠。上面的两个方法都对防止会话劫持提供了强有力的手段。你需要做的是在安全性和可靠性之间作出平衡。

以上就是PHP安全-会话劫持的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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