2013-07-01 3 views
7

PHP로 부울 $_SESSION['logged_in']을 포함하는 웹 사이트를 코딩하고 있습니다. 사용자 이름과 암호가 일치하면 데이터베이스에 true으로 설정됩니다.세션 스푸핑 (PHP)

저는 세션에 아주 익숙하며 등록되지 않은 (또는 등록 된) 사용자가이 부울을 true으로 설정하여 로그인 프로세스를 우회 할 수 있는지 궁금합니다. 쿠키.

사용자가 클라이언트 측에서 서버 측 변수를 조작해야한다는 것을 이해하지만, 내 질문은 얼마나 쉬운 일인지, 사용자가 그런 작업을 수행하는 방법, 알려진 악용 사례가 있는지 등입니다. , 그리고 이러한 종류의 공격을 피하기위한 최선의 방법/예방책은 무엇입니까?

+2

클라이언트가 특별히 허용하지 않고 서버에서 세션 데이터를 변경할 수있는 경우보다 큰 문제가 있습니다. 나는 세션 데이터가 저장되어있는 공유 된 임시 디렉토리와 함께 몇 가지 진절한 공유 호스팅에 대해 더 걱정할 것이다. 또는 심지어 세션 고정. – PeeHaa

+0

@PeeHaa, agree .. – verbumSapienti

+0

http://stackoverflow.com/questions/6912223/is-it-possible-to-change-a-session-variable-client-side –

답변

14

좋은 소식부터 시작합시다 : $_SESSION 배열은 다음과 같습니다. 기본적으로 클라이언트에게는 보이지 않고 조작 할 수 없습니다. 서버 및 실행 환경의 서버에만 존재하며 클라이언트에게는 열려 있지 않습니다.

이제 다시 생각해보십시오. PHP 코드가 "거의 올바르다"는 것은 매우 쉽습니다. 따라서 서버에서 볼 수있는 클라이언트와 세션 사이의 문을 열어보십시오. 이 외에도 클라이언트 세션 (쿠키 포함)을 도용하는 것은 매우 쉽습니다. - 대신에 "세션 쿠키"값을 저장하고, 클라이언트에 쿠키를 설정

  • A는 값 "로그인"보관하지 마십시오 :

    은 꽤 효과가 입증 된 몇 완화가 좋습니다. 클라이언트 요청시 $loggedin=($_SESSION['cookie']==$_COOKIE['session']) 행을 따라 무언가를 작성하십시오. 이로 인해 공격자는 쿠키와 세션 ID가 모두 필요합니다.
  • 세션 쿠키를 자주 새로 고치십시오. 쿠키를 잘못 입력하면 세션이 종료됩니다. 검은 모자가 쿠키와 세션을 가로 채면 실제 사용자가 다음에 클릭하면 로그 아웃하여 로그 가능한 이벤트를 만듭니다.
  • 요청이 JS에서 온 경우 간단한 인증 기능을 만드는 것이 좋습니다. 인증 토큰을 보내지 않고 소금을 치고 타임 스탬프로 뒤집은 다음 해시합니다. 소금, 타임 스탬프 및 해시를 보냅니다. 서버가 시간 소인을 확인하게하십시오.
+0

정보 및 좋은 제안에 감사드립니다 – verbumSapienti

+1

나는 소금 후추를 좋아했습니다. –

1

코드에서 세션의 값을 조작하는 것은 불가능합니다. 누군가이를 우회하려면 서버에서 코드를 실행하거나 코드 또는 서버의 보안 허점을 악용 할 수있는 권한이 있어야합니다 (보안 공격). 사용자가이를 수행 할 수 있다면 서버에서 실제로 다른 작업을 수행 할 수 있기 때문에 세션 값을 무시하고 걱정할 필요가 없을 것입니다.

0

이 공격이 가능할 수있는 유일한 방법은 코드에 다른 악용 사례가 있거나 다른 방법을 통해 서버에 액세스 할 수 있는지 여부입니다. 물론 서버에 액세스 할 수 있으면 데이터베이스, 소스 코드, 웹 로그, 암호를 포함한 모든 원시 인터넷 트래픽에 액세스 할 수 있습니다. ...

1

세션 도메인에서 가장 일반적인 문제는 Session Hijacking입니다. 이는 세션이 세션 매개 변수와 연결되어 있기 때문입니다. 이 매개 변수는 요청을 서버에 보낼 때마다 사용자가 제공해야합니다. 누군가가 매개 변수를 추측하거나 검색 할 수 있다고 상상할 수 있듯이 세션을 도용 할 수 있어야합니다.

편집 : 보안 조치를 위해 Eugen Reck의 게시물을 살펴보십시오.