이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 5685|회답: 2

[출처] ASP.NET 코어 (20) 오픈 리다이렉트 공격 방지

[링크 복사]
게시됨 2023. 6. 6. 오후 9:55:38 | | | |
요구사항: 최근에 마이크로소프트의 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을 수정할 수 있습니다.

참조:하이퍼링크 로그인이 보입니다.

(끝)





이전의:도커는 Windows 시스템 위에 이미지를 구축합니다
다음:[Turn] (MSSQL) SQL Server 데이터베이스의 int 및 guid를 기본 키 비교를 위해
 집주인| 게시됨 2023. 6. 6. 오후 9:57:12 |
ASP.NET 코어(19)는 백그라운드 작업을 실행하기 위해 BackgroundService를 사용합니다
https://www.itsvse.com/thread-10591-1-1.html

ASP.NET 코어 (18) 간단한 OutputCache 출력 캐시를 커스터마이즈하기
https://www.itsvse.com/thread-10583-1-1.html

ASP.NET 코어(17)는 MiniProfile 애플리케이션 성능 분석을 통합합니다
https://www.itsvse.com/thread-10571-1-1.html

ASP.NET 코어 (16) 동적 등록 서비스 주입에 의존함
https://www.itsvse.com/thread-10560-1-1.html

ASP.NET 코어(XV)는 HTTP 요청을 보낼 때 HttpClient를 사용합니다
https://www.itsvse.com/thread-10311-1-1.html

ASP.NET 코어(14)는 SkiaSharp 이미지 캡차를 기반으로 합니다
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core(XIII)를 통해 Ajax 요청인지 여부를 판단할 수 있습니다
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET 코어(12개) 프론트엔드 JS, CSS 번들링, 압축
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET 코어(XI) 엔드포인트 경로는 모든 DI 서비스를 표시하는 미들웨어를 추가합니다
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Core(10)에서의 구성 우선순위에 대한 상세 설명.
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Core (9)의 미들웨어 미들웨어에 대한 상세한 설명.
https://www.itsvse.com/thread-9647-1-1.html

Core(8) Swagger UI 기본 매개변수의 ASP.NET 구멍입니다.
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET 핵심 (7) 프레임워크 소스 코드에 대한 심층 분석
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET 코어(VI) DI는 객체 주입 방식을 수동으로 획득합니다
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET 코어(다섯 개)는 CAP 분산 트랜잭션을 기반으로 합니다
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET 코어(4) 필터 통합 모델스테이트 모델 검증
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET 코어 (iii) ActivatorUtilities를 사용하여 동적으로 인스턴스를 생성합니다
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET 코어 (2) 코드로 애플리케이션을 재시작함
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET 코어(1)는 Redis 캐싱을 사용합니다
https://www.itsvse.com/thread-9393-1-1.html
 집주인| 게시됨 2023. 6. 6. 오후 10:01:21 |
IsLocalUrl 메서드는 다음과 같이 .NET 프레임워크로 포팅됩니다:

면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com