요구사항: 최근에 마이크로소프트의 ASP.NET Core 문서 "Preventing Open Redirect Attacks in ASP.NET Core"를 읽었는데, 대략개발자들은 콜백 주소로 점프할 때 로컬 사이트의 경로를 주의 깊게 살펴야 하며, 이를 막기 위해 일부가 악의적으로 콜백 주소를 피싱 공격에 이용하는 것을 막아야 합니다。 코드를 공부하고 ASP.NET MVC 프로젝트로 이식할 준비를 하세요.
예전에 대형 제조사가 이 취약점을 가지고 있었던 걸로 기억하는데, 일부 사람들은 이를 이용해 QQ와 WeChat의 트래픽을 빼앗기도 했습니다. 다음과 같습니다:
이 취약점을 악용한 일부 채팅 도구는 대기업 도메인을 신뢰하는 사용자들의 악성 웹사이트 콘텐츠 클릭을 막지 못했습니다.
오픈 리다이렉트 공격이란 무엇인가요?
웹 애플리케이션은 인증이 필요한 자원에 접근할 때 사용자가 로그인 페이지로 자주 리다이렉션됩니다. 리디렉션에는 일반적으로 returnUrl 쿼리스트링 매개변수가 포함되어 있어, 사용자가 로그인 성공 후 원래 요청한 URL로 돌아갈 수 있습니다. 사용자가 인증한 후에는 원래 요청한 URL로 리디렉션됩니다.
공격의 예시
악의적인 사용자는 사용자의 자격 증명이나 민감한 정보에 접근하도록 설계된 공격을 개발할 수 있습니다. 공격을 시작하기 위해 악의적인 사용자가 사용자를 속여 사이트 랜딩 페이지 링크를 클릭하게 하고, 그 URL에 returnUrl querystring 값을 추가합니다. 이를 위해contoso.com예를 들어, 앱은http://contoso.com/Account/LogOn?returnUrl=/Home/About랜딩 페이지가 포함되어 있습니다. 공격은 다음과 같은 단계를 따릅니다:
- 사용자가 악성 링크를 클릭하면http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn(두 번째 URL은 "contoso1.com", 대신 "contoso.com”) 。
- 사용자가 성공적으로 로그인합니다.
- 사용자는 사이트로 리디렉션됩니다http://contoso1.com/Account/LogOn(실제 사이트와 똑같이 생긴 악성 사이트입니다.)
- 사용자는 다시 로그인하여 악성 사이트에 자격 증명을 제공하고, 실제 사이트로 리디렉션됩니다.
- 사용자는 첫 번째 로그인 시도가 실패하고 두 번째 시도가 성공했다고 생각할 수 있습니다.사용자들은 아직도 자신의 자격 증명이 유출되었다는 사실을 모를 가능성이 큽니다。
랜딩 페이지 외에도 일부 사이트는 리다이렉션 페이지나 엔드포인트를 제공합니다. 예를 들어, 앱에 /Home/Redirect라는 오픈 리디렉션이 포함된 페이지가 있다고 합시다. 예를 들어, 공격자는 이메일에서 포인트를 생성할 수 있습니다[yoursite]/Home/Redirect?url=http://phishingsite.com/Home/로그인링크. 일반 사용자는 URL이 사이트 이름으로 시작하는 것을 볼 수 있습니다. 신뢰를 얻은 그들은 링크를 클릭합니다. 오픈 리디렉션은 사용자를 당신의 사이트와 똑같이 생긴 피싱 사이트로 보내고, 사용자가 본인의 사이트라고 생각하는 사이트에 로그인할 수 있습니다.
오픈 리다이렉트 공격 방지
웹 애플리케이션을 개발할 때 모든 사용자가 제공한 데이터는 신뢰할 수 없는 것으로 간주됩니다. 앱이 URL 내용을 기반으로 사용자를 리디렉션할 수 있는 기능이 있다면, 이러한 리디렉션은 앱 내에서 로컬에서만 이루어지거나(또는 쿼리스트링에 제공되는 URL이 아닌 알려진 URL로 리디렉션되도록 하세요).
로컬리다이렉트
LocalRedirect 기본 클래스의 컨트롤러 헬퍼 메서드를 사용하면:
비로컬 URL이 지정되면 LocalRedirect가 예외를 던집니다. 그렇지 않으면 리다이렉트 방법과 동일하게 동작합니다. 예외 정보는 다음과 같습니다:
InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths ('~/') are also local. 소스 코드는 다음과 같습니다:
실행 과정: LocalRedirect -> LocalRedirectResult -> IActionResultExecutor<LocalRedirectResult> -> LocalRedirectResultExecutor -> UrlHelper -> IsLocalUrl -> CheckIsLocalUrl, 그리고 결국 IsLocalUrl이 호출되어 판정됩니다 (UrlHelperFactory는 기본적으로 IUrlHelperFactory 인터페이스를 구현합니다. )。
소스 코드 주소:하이퍼링크 로그인이 보입니다.
IsLocalURL
리디렉션하기 전에 IsLocalUrl을 사용해 URL을 다음 방법으로 테스트하세요:
코드는 다음과 같습니다:
테스트 코드는 다음과 같습니다:
다른 도메인 이름 사이트로 이동할 수 있다면, IUrlHelperFactory 인터페이스를 구현하고 프로그램 시작 시 기본 구현 클래스를 대체하도록 IServiceCollection을 수정할 수 있습니다.
참조:하이퍼링크 로그인이 보입니다.
(끝)
|