Open Redirect
Introduction
Open Redirect는 웹 서비스에서 사용자의 입력을 기반으로 redirect 하는 기능을 이용하여 공격자가 의도한 도메인으로 사용자를 이동시키는 공격 방법을 의미합니다.
보통의 사람들은 웹 서비스의 URL을 볼 떄 도메인을 신뢰하기 때문에 해당 도메인의 링크를 신뢰하고 클릭하는데, 이 때 Open Redirect가 있는 경우 공격자가 의도한 사이트로 이동시킬 수 있기 때문에 가볍게는 피싱부터 연계되어 XSS나 계정 탈취등에도 충분히 이용될 수 있습니다.
Offensive techniques
Detect
탐지 방법은 간단합니다. 사용자의 입력을 기반으로한 redirect 페이지를 찾으면 되는데, 서비스에 따라서 스펙으로 보는 경우도 있어서 리스크를 증명하여 해결해야 합니다.
Request
GET /redirect?url=https://untrusted.domain HTTP/1.1
Response
HTTP/1.1 302 Found
Location: https://untrusted.domain
Redirect status code
Status code | Msg |
---|---|
300 | Multiple Choices |
301 | Moved Permanetly |
302 | Found |
303 | See Other |
304 | Not Modified |
305 | Use Proxy |
307 | Temporary Redirect |
308 | Permanent Redirec |
Exploitation
Phishing
기본적으로 Open redirect는 피싱에 사용될 수 있습니다. 사용자는 신뢰하는 도메인의 링크만 보고 접근하기 때문에 redirect를 통해 사용자의 정보를 탈취하려는 위장된 페이지로 이동시켜 정보를 탈취할 수 있습니다.
XSS
Open redirect는 보통 Location 헤더나 js단에서 redirect를 진행하는데, 이 때 protocol 까지 제어가 가능한 경우 아래와 같은 형태로 XSS도 가능합니다.
GET /redirect?url=javascript:alert(45) HTTP/1.1
GET /redirect?url=data:(45) HTTP/1.1
다만 최신 브라우저에서는 대다수가 Location 헤더 기반의 XSS는 차단하고 있기 때문에 JS단에서 이동되는 경우나 아래 글과 같이 Location + JS의 경우에만 유효한 방법입니다.
- https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/
Bypass protection
Host validation bypass
Host bypass에 자주 사용하는 패턴은 아래와 같습니다.
/redirect?url=javascript:alert(45) HTTP/1.1 url=https://allow_domain.hahwul.com
/redirect?url=https://allow_domain@hahwul.com
/redirect?url=https://www.hahwul.com#allow_domain
/redirect?url=https://www.hahwul.com?allow_domain
/redirect?url=https://www.hahwul.com\allow_domain
/redirect?url=https://www.hahwul.com&allow_domain
/redirect?url=https:///////////www.hahwul.com
/redirect?url=https:\\www.hahwul.com
/redirect?url=https:\/\/www.hahwul.com
https://www.hahwul.com/phoenix/ssrf-open-redirect/#openredirect
Parameter Pollution
/redirect?url=allow_domain&url=https:\\www.hahwul.com
https://www.hahwul.com/2021/06/21/bypass-host-validation-with-parameter-pollution/
With Normalization
https://evil.c℀.example.com . ---> https://evil.ca/c.example.com
http://a.com/X.b.com
Defensive techniques
Redirect 기능이 있는 페이지는 가급적 허용된 주소를 제외하곤 접근하지 못하도록 제한하는게 좋습니다. 만약 외부 링크 접근이 필요한 경우 사용자에게 안내 메시지를 주는 것도 좋은 방법 중 하나 입니다.
Tools
- https://github.com/hahwul/dalfox (in BAV)
Articles
- https://www.hahwul.com/2019/09/23/bypass-host-validation-technique-in-android/
- https://www.hahwul.com/2019/02/19/bypass-ssrf-protection-using-domain-cname-arecord/
- https://www.hahwul.com/phoenix/ssrf-open-redirect/
- https://www.hahwul.com/2021/06/21/bypass-host-validation-with-parameter-pollution/
References
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open%20Redirect