문제

이는 다음과 관련이 있습니다. 내가 물은 또 다른 질문.요약하자면, 양식이 게시될 때 인증이나 사용자 세션 유지를 위해 쿠키를 사용할 수 없는 특별한 URL 사례가 있습니다. 하지만 어떻게든 그들이 누구인지 알아야 하고, 그들이 로그인했는지 확인하세요!

내 문제에 대한 해결책을 찾았다고 생각하지만 구체화가 필요합니다.내가 생각하는 것은 다음과 같습니다."사용자 이름"이라는 숨겨진 양식 필드를 만들고 그 안에 사용자 이름을 암호화하여 넣습니다.그런 다음 양식 POST가 완료되면 브라우저에서 쿠키를 받지 못하더라도 숨겨진 양식 필드를 해독하고 사용자 이름을 얻을 수 있으므로 로그인되어 있다는 것을 알 수 있습니다.

제가 볼 수 있는 주요 보안 결함은 재생 공격입니다.누군가 암호화된 문자열을 확보하고 해당 사용자로 게시하는 것을 방지하려면 어떻게 해야 합니까?SSL을 사용하여 해당 문자열을 훔치기 어렵게 만들 수 있다는 것을 알고 있으며 정기적으로 암호화 키를 순환하여 문자열이 유효한 시간을 제한할 수도 있지만 실제로는 방탄 키를 찾고 싶습니다. 해결책.누구든지 아이디어가 있나요?ASP.Net ViewState가 재생을 방지합니까?그렇다면 그들은 어떻게 합니까?

편집하다:나는 데이터베이스에 저장된 어떤 것도 필요하지 않은 솔루션을 기대하고 있습니다.IIS를 다시 시작해도 유지되지 않거나 웹 팜 또는 가든 시나리오에서 전혀 작동하지 않는다는 점을 제외하면 응용 프로그램 상태는 괜찮습니다.나는 데이터베이스 없이 이것을 보호하는 것이 가능하다고 확신하지 못하기 때문에 지금은 Chris의 답변을 받아들입니다.하지만 누군가가 데이터베이스와 관련되지 않은 답변을 제시한다면 나는 그것을 받아들일 것입니다!

도움이 되었습니까?

해결책

사용자 이름 및 비밀번호와 함께 타임스탬프를 해시하면 몇 초 이내에 재생 공격 창을 닫을 수 있습니다.이것이 귀하의 요구 사항을 충족하는지 모르겠지만 적어도 부분적인 솔루션입니다.

다른 팁

어떤 상태도 저장하고 싶지 않다면 타임스탬프와 짧은 만료 시간을 사용하여 재생 공격을 제한하는 것이 최선이라고 생각합니다.예를 들어 서버는 다음을 보냅니다.

{Ts, U, HMAC({Ts, U}, Ks)}

여기서 Ts는 타임스탬프, U는 사용자 이름, Ks는 서버의 비밀 키입니다.사용자는 이를 다시 서버로 보내고, 서버는 제공된 값에 대해 HMAC를 다시 계산하여 이를 검증합니다.유효하다면 언제 발행되었는지 알 수 있으며, 5분보다 오래되었다면 무시하도록 선택할 수 있습니다.

이러한 유형의 개발을 위한 좋은 리소스는 다음과 같습니다. 웹에서 클라이언트 인증 시 해야 할 일과 하지 말아야 할 일

여기에는 몇 가지 좋은 답변이 있으며 이를 모두 합치는 것이 궁극적으로 답이 되는 곳입니다.

  1. 클라이언트로 전송되는 모든 상태/논스 관련 정보를 블록 암호화 암호화(AES-256+ 사용) 및 해시(SHA-2+ 사용)합니다.그렇지 않으면 해커는 데이터를 조작하고 이를 보고 패턴을 배우고 다른 모든 것을 우회합니다.기억하다 ...열린 창은 하나만 있으면 됩니다.

  2. POST 요청과 함께 다시 전송되는 요청당 일회성 무작위 고유 nonce를 생성합니다.이는 두 가지 작업을 수행합니다.POST 응답이 해당 요청과 함께 진행되는지 확인합니다.또한 특정 get/POST 쌍 세트의 일회성 사용을 추적할 수 있습니다(재생 방지).

  3. Nonce 풀을 관리 가능하게 만들려면 타임스탬프를 사용하세요.위의 #1에 따라 암호화된 쿠키에 타임스탬프를 저장합니다.애플리케이션의 최대 응답 시간 또는 세션(예: 1시간)보다 오래된 요청은 삭제합니다.

  4. 암호화된 타임스탬프 데이터를 사용하여 요청하는 기계의 "합리적으로 고유한" 디지털 지문을 저장합니다.이렇게 하면 공격자가 세션 하이재킹을 수행하기 위해 클라이언트 쿠키를 훔치는 또 다른 트릭을 방지할 수 있습니다.이렇게 하면 요청이 한 번만 반환되는 것이 아니라 양식이 전송된 컴퓨터(또는 공격자가 복사하는 것이 사실상 불가능할 만큼 충분히 가까운 위치)에서 다시 돌아오도록 할 수 있습니다.

코딩 없이 위의 모든 작업을 수행하는 ASPNET 및 Java/J2EE 보안 필터 기반 응용 프로그램이 있습니다.성능이 중요한 경우 대규모 시스템(주식 거래 회사, 은행 또는 대용량 보안 사이트 등)의 임시 풀을 관리하는 것은 결코 쉬운 일이 아닙니다.각 웹 애플리케이션에 대해 프로그래밍하는 것보다 해당 제품을 살펴보는 것이 좋습니다.

해시를 생성하기 위해 사용자 이름과 함께 사용되는 일종의 무작위 챌린지 문자열을 사용할 수 있습니다.서버의 데이터베이스에 챌린지 문자열을 저장하면 해당 문자열이 특정 사용자 한 명에게만 한 번만 사용되도록 보장할 수 있습니다.

'재생' 공격을 중지하기 위해 내 앱 중 하나에서 세션 개체에 IP 정보를 삽입했습니다.코드에서 세션 개체에 액세스할 때마다 Request.UserHostAddress를 전달한 다음 비교하여 IP가 일치하는지 확인합니다.그렇지 않다면 분명히 그 사람이 아닌 다른 사람이 이 요청을 한 것이므로 null을 반환합니다.이것이 최선의 해결책은 아니지만 재생 공격을 막는 데 최소한 하나의 장벽이 더 있습니다.

유지 관리를 위해 메모리나 데이터베이스를 사용할 수 있습니까? 어느 사용자에 대한 정보나 요청이 전혀 없나요?

그렇다면 양식 요청 시 내용이 무작위로 생성된 숫자인 숨겨진 양식 필드를 포함하겠습니다.요청이 렌더링될 때 이 토큰을 애플리케이션 컨텍스트나 일종의 저장소(데이터베이스, 플랫 파일 등)에 저장하세요.양식이 제출되면 무작위로 생성된 번호가 여전히 유효한지 확인하기 위해 애플리케이션 컨텍스트나 데이터베이스를 확인하세요(유효하다고 정의하는 방법과 상관없이 X분 후에 만료될 수 있음).그렇다면 "허용된 토큰" 목록에서 이 토큰을 제거하십시오.

따라서 재생된 요청에는 더 이상 서버에서 유효하지 않은 것으로 간주되는 동일한 토큰이 포함됩니다.

저는 웹 프로그래밍의 일부 측면을 처음 접했지만 요전에 이에 대해 읽고 있었습니다.나는 당신이 목하.

(재생 공격은 쉽게 IP/MAC 스푸핑에 관한 것일 수 있으며 동적 IP에 대한 문제도 발생합니다)

여기서 당신이 추구하는 것은 단순히 재생이 아니라, 그 자체로는 의미가 없습니다.SSL을 사용하고 손으로 만드는 것을 피하십시오..

ASP.Net ViewState는 엉망입니다. 피하세요.PKI는 무겁고 비대하기는 하지만 최소한 자체적인 보안 '체계'를 고안하지 않고도 작동합니다.그래서 가능하다면 나는 그것을 사용하고 항상 상호 인증을 추구할 것입니다.서버 전용 인증은 전혀 쓸모가 없습니다.

ViewState에는 보안 기능이 포함되어 있습니다.보다 이 기사 ASP.NET에 내장된 보안 기능 중 일부에 대해 알아보세요.서버의 machine.config에 있는 서버 machineKey에 대해 유효성 검사를 수행하여 각 포스트백이 유효한지 확인합니다.

기사 아래에서 더 자세히, 자신의 숨겨진 필드에 값을 저장하려는 경우 다음을 사용할 수 있다는 것도 알 수 있습니다. LosFormatter ViewState가 암호화에 사용하는 것과 동일한 방식으로 값을 인코딩하는 클래스입니다.

private string EncodeText(string text) {
  StringWriter writer = new StringWriter();
  LosFormatter formatter = new LosFormatter();
  formatter.Serialize(writer, text);
  return writer.ToString();
}

각 키를 한 번만 수락하면(예: 키를 GUID로 만든 다음 다시 돌아올 때 확인) 재생이 방지됩니다.물론, 공격자가 대응한다면 첫 번째, 그러면 새로운 문제가 발생합니다...

이것은 WebForms입니까, 아니면 MVC입니까?MVC인 경우 AntiForgery 토큰을 활용할 수 있습니다.이는 기본적으로 GUID를 사용하고 해당 게시물에 대한 guid 값으로 쿠키를 설정한다는 점을 제외하면 언급한 접근 방식과 유사한 것 같습니다.이에 대한 자세한 내용은 Steve Sanderson의 블로그를 참조하세요. http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

또 다른 문제는 포스트백에서 리퍼러를 확인해 보셨나요?이것은 방탄은 아니지만 도움이 될 수 있습니다.

https를 사용하세요...재생 방지 기능이 내장되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top