2012-06-06 1 views
2

SSL을 사용하지 않고 PHP 세션을 보안 화하는 것에 관심이 있습니다.패킷 스니핑을 통한 세션 하이재킹으로부터 인증 된 PHP 세션 보호

놀랍게도 중간자가 사용자와 서버간에 교환되는 패킷을 스니핑하면 세션이 인증 되더라도 세션을 도용하기가 매우 쉽습니다. 로그인/로그 아웃시 sessionid 변경, 사용자 시스템 매개 변수 (예 : OS, 브라우저) 기록/확인과 같은 피해를 줄이기위한 몇 가지 전술이 있음을 알고 있습니다.

그러나 이미 인증되었지만 로그 아웃되지 않은 경우 (시간 초과가없는 시간) 공격자는 세션 ID를 가져올 수 있으며 세션을 도용 할 수 있습니다. 나는 그 문제를 이해한다.)

가능한 해결책에 대해 생각해 보았습니다. 가능한 해결책은 암호화 된 로그인 인증 중에 서버가 임의의 세션 암호를 클라이언트에 보낼 수 있다는 것입니다. 세션 암호는 해당 로그인 세션 동안에 만 유효합니다. 따라서 세션 중에 교환 된 모든 메시지는 세션 비밀번호 (예 : MD5 (세션 비밀번호 + 메시지 콘텐츠))를 사용하여 서명해야합니다.

문제가 해결 되었습니까? 침입자가 초기 로그인 교환을 암호화 분석 할 수 없다고 가정 할 때이 접근법의 약점은 무엇입니까?

+2

위법은 아니지만 SSL 만 사용하는 것으로 간주됩니다 ... 1 년에 약 49 ~ 100 달러의 비용이 들지만 사용자 정의 보안 체계 인 –

+0

+1을 유지 관리하는 데 개발자에게 비용을 지불하는 것보다 훨씬 저렴합니다. 또한, @ João Salada, 무작위 세션 비밀 번호는 SSL없이 어떻게 전송됩니까? –

+0

불쾌감 없음! ;) 나는 단지 처음부터 내 블로그를 만들고 싶다. 그래서이 블로그와 같은 주요한 문제가 무엇인지 이해할 수있다. 하지만 ssl을 사용하는 것은 당신이 기밀성 (나의 의견)을 가질 필요가 없을 때 엄청난 과잉이다. 비록 내가 생각하기에이 계획은 아주 간단 해 보입니다 ... 그래서 그것이 문제를 해결했는지 또는 결함이 있는지 묻고 싶었습니다. – Leaurus

답변

3

제안 된 "서명"솔루션에는 클라이언트 측 동작이 필요하므로 서명 할 수있는 클라이언트 측 응용 프로그램이 필요합니다.

플래시/자바 애플릿/유니티 또는 그 플러그인 중 하나를 작성하는 경우 클라이언트를보다 면밀히 제어하고 서명을 수행 할 수 있도록 계획을 수행 할 수 있습니다.

하지만 플러그인을 사용하지 않고 HTML 페이지를 브라우저로 전송한다고 가정합니다. 그렇다면 두 가지 선택이 있습니다. 브라우저에 내장되어 있기 때문에 주먹은 SSL입니다 (배제합니다). 두 번째는 Javascript입니다. 최대한의 보안을 위해 암호화 (공개) 키/algorythm의 클라이언트 측 저장소 (메시지와 함께 절대로 여행하지 않도록)를 비롯하여 SSL을 어떻게 든 모방해야합니다. 가능한 공개 키/개인 키 + SSL 핸드 셰이크에 가까워지고 싶을 것입니다. 이것은 결코 의미있는 일이 아닙니다. sarnold에 의해 제안 된 것처럼 강력한 encyption key를 원할 것입니다. 예를 들어 http://www.jcryption.org/을 확인하십시오. 다른 검색 결과가 나타납니다.

조금 지나치게 길면 가장 유용한 솔루션은 JS를 사용하여 더 간단한 encyption algorthym을 협상하는 것입니다 : "키"를 보내고 브라우저의 쿠키에 "키"를 저장하고 AJAX를 통한 모든 통신 그 키를 기반으로 한 더 간단한 서명 메카니즘을 작성합니다 (초기 핸드 셰이크 중에 클라이언트가 공유 한 다른 변수도 가능).키를 디코드하거나 일치시키지 않는 것이 있으면 전체 세션을 종료하고 다시 시작하십시오.


sarnold는 md5 및 SHA-1이 회피된다는 그의 답변에서 좋은 점을 가지고 있습니다. 심지어 몇몇은 심지어 SHA256이 오늘날의 컴퓨터를위한 기본 기술이라고 생각하지만, JS에서 해결책을 내포해야한다고 생각할 때, 속도면에서 md5와 같은 "piddly"(필자의 유추)로 묶일 수 있습니다. 따라서 가장 적절한 방어 방법은 정확한 로깅 및 무차별 대입/오류 탐지입니다. 도착하는 모든 메시지가 왜곡되고 (양쪽 끝에서 확인할 수 있음) 기록되고 모니터링되어야합니다. 실패 횟수가 너무 많으면 IP 주소가 금지되어 로깅을 유지합니다.

+0

두 번째 옵션을 생각하고 있었는데 그 웹 사이트는 내가 원했던 것입니다. ;) SSL/TLS 체계의 일부인 Public/Private key 접근법의 문제점은 값 비싼 서명 된 인증서가 필요하다는 것입니다. 다른 한편으로는, 그 verisign, etc.에 의해 서명되지 않는 증명서를 사용하는 경우에 브라우저는 당신에게 큰 경고를 돌려 보낼 것이고, 사람들의 대부분은 떠날 것이다. 이것은 내 블로그를위한 것입니다 ... – Leaurus

+1

인증서는 연간 약 20 달러 정도면 저렴합니다. 예 : http://www.hostnexus.com/solutions/certificates-compare.php. 가격의 유일한 차이점은 보험료와 함께 지급되는 보험 및 양육비입니다. 비 SSL 솔루션을 작동 시키려고 노력하는 것보다 훨씬 많은 것을 소비 할 것입니다. 그러나 혼자가는 경우에, 나는 도울 수있어서 기쁘다. – Robbie

2

간단한 MD5 대신 HMAC과 같은 것을 사용하고 싶습니다. MD5에 약점이 있고 SHA-1이 약해지기 시작 했으므로 SHA256 이상을 사용하고 싶을 것입니다.

그러나 이러한 변경 사항이 적용되는 경우에도 사용자의 구성표는 여전히 replay attacks에 취약 할 수 있으며 공격자는 요청을 반복해서 다시 보낼 수 있으며 서버는 매번 행복하게 재실행합니다. 최신 해변 여행 사진을 게시하는 경우 큰 문제는 아니지만 1000 달러짜리 조랑말 구매 요청을 보내는 경우 누군가는 예상했던 것보다 조랑말이 많을 것입니다.

프로토콜에 nonce을 추가해야합니다.

다른 문제가 발생할 가능성이 있습니다. 결국 TLS는 SSL을 3 번 반복 한 후에 버전 1.2에 있습니다. 그냥 TLS를 고수하고 행복하게 지내십시오.

+0

예, MD5는 접두사 공격에 취약합니다. MD5를 예로 들었다. 그러나 어쨌든 당신을 감사하십시오. 계획에 몇 가지 이점이 있는지를 알고 싶었습니다. 그리고 당신은 절대적으로 옳습니다. 고마워;) – Leaurus