방지 토큰 소금의 사용은 무엇입니까?
-
05-07-2019 - |
문제
ASP.NET MVC 1.0에는 크로스 사이트 요청 위조 보안 문제를 처리하는 새로운 기능이 있습니다.
<%= Html.AntiForgeryToken() %>
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc
}
새로운 양식이 렌더링 될 때마다 HTML 양식으로 생성 된 토큰이 계속 변경되었습니다.
이 토큰이 어떻게 생성되는지 알고 싶습니까? 일부 소프트웨어를 사용 하여이 사이트를 스캔하면 다른 보안 문제인 세션이 고정됩니다. 왜요? 토큰이 계속 변경 되었으므로이 문제는 어떻게 올 수 있습니까?
그리고 또 다른 기능, 즉 "소금"이 있습니다. antiForgeryToken
, 그러나 나는 우리가 "소금"을 사용하여 토큰을 생성하지 않더라도 토큰이 항상 변할 것이므로 왜 그러한 기능이 있는가?
해결책
antiforgerytoken에 대한 많은 정보 : http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/
이는 CSRF (Cross-Site Request Prostery)를 방지하기위한 것입니다. Sumbit 양식을 '저장'하고 서버에서 일부 조치를 수행하는 것은 꽤 표준적인 동작입니다. 즉, 사용자의 세부 정보를 저장합니다. 양식을 제출하는 사용자가 사용자가 주장하는 사용자인지 어떻게 알 수 있습니까? 대부분의 경우 쿠키 또는 Windows 기반 인증을 사용합니다.
공격자가 당신을 약간 숨겨진 iframe에 정확히 같은 형태를 제출하는 사이트로 유혹한다면 어떨까요? 쿠키는 그대로 제출되며 서버는 요청을 합법적 인 요청과 다른 것으로 보지 않습니다. (Gmail이 발견 한대로 : http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/)
방지 토큰은 페이지가 생성 될 때마다 추가 쿠키 토큰을 만들어 이러한 형태의 공격을 방지합니다. 토큰은 양식과 쿠키 모두에 있습니다. 양식과 쿠키가 일치하지 않으면 CSRF 공격이 있습니다 (공격자가 위에서 설명한 공격을 사용하여 황지대 토큰을 읽을 수 없기 때문에).
위의 기사에서 소금은 무엇을합니까 :
소금은 단지 임의의 끈입니다. 다른 소금 값은 다른 방지 토큰이 생성 될 것임을 의미합니다. 이는 공격자가 어떻게 유효한 토큰을 유지하더라도 다른 소금 값이 필요한 응용 프로그램의 다른 부분에서 재사용 할 수 없음을 의미합니다.
업데이트: 토큰은 어떻게 생성됩니까? 다운로드 원천, antiforgeryDataserializer, antiforgeryData 클래스를 살펴보십시오.
다른 팁
당신은 몇 가지 관련이없는 문제를 묻습니다.
- 보안 소프트웨어가 왜 '세션 고정'을보고하는지 모르겠습니다. 보고서와 함께 제공되는 문서를 읽으십시오
- 황홀한 토큰 :
이것은 각 요청이 유효한지 확인하는 데 사용됩니다 (아마도). 그러니 누군가가 페이지에 대한 링크를 제시하려고한다고 생각합니다. ?x=1
, 토큰이 통과되지 않으면 요청이 거부됩니다. 또한, 동일한 항목의 중복 게시를 방지합니다. '게시'를 두 번 클릭하면 토큰이 변경 될 수 있으며 (각 요청),이 경우는 다음과 같은 것을 통해 감지됩니다.
Session["nextToken"] = token;
WriteToken(token);
...
if( !Request["nextToken"] == Session["nextToken"] ){
...
}
// note: order in code is slightly different, you must take the token
// before regenerating it, obviously
요즘에는이 용어 (그것이 보호하는 공격)를 "CSRF"(크로스 사이트 요청 위조)라고 생각합니다.