개요
- Dom based 타입의 XSS 취약점 문제이다.
- 문제 주소: https://portswigger.net/web-security/dom-based/open-redirection/lab-dom-open-redirection
- 취약점 설명페이지: https://portswigger.net/web-security/dom-based/open-redirection
- 난이도: PRACTITIONER (보통)
Open Redirection 취약점 개요
- Open Redirection 은 피싱 공격에 이용될 가능성이 있는 취약점이다.
- CVE 데이터베이스를 찾아보면 Open Redirection의 CVSS 스코어는 Medium 인 경우가 많았다.
- DOM-based Open Redirection 은 공격자가 컨트롤 가능한 데이터가 크로스 도메인을 탐색할 수 있는 sink로 전달될 때 일어난다. 예를 들면, 다음 코드는
location.hash
속성을 안전하게 핸들링하고 있지 않기 때문에 취약하다.
let url = /https?:\/\/.+/.exec(location.hash);
if (url) {
location = url[0];
}
DOM-based Open Redirection 을 일으킬 수 있다고 알려진 sink
다음이 DOM-based Open Redirection 을 일으킬 수 있다고 알려진 sink 들이다.
location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
element.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()
문제
- 이 랩에는 DOM 베이스의 오픈 리다이렉션 취약점이 존재한다.
- 랩을 풀려면 이 취약점을 exploit하여 victim을 exploit서버로 리다이렉트 시켜라.
This lab contains a DOM-based open-redirection vulnerability. To solve this lab, exploit this vulnerability and redirect the victim to the exploit server.
풀이
- 일단 취약점이 있어보이는 Javascript 코드를 찾는다. 랩의 블로그 포스트 글을 보면 되돌아가기 버튼이 다음과 같은 코드로 이루어진 것을 알 수 있다.
<div class="is-linkback">
<a href='#' onclick='returnUrl = /url=(https?:\/\/.+)/.exec(location); location.href = returnUrl ? returnUrl[1] : "/"'>Back to Blog</a>
</div>
- 분석을 위해서 onclick 이벤트시 동작하는 코드를 좀더 보기 쉽게 만들면 다음과 같다.
- 정규표현식
/url=(https?:\/\/.+)/
을 사용해서 location 의 값을 체크한 결과를 returnUrl 변수에 저장한다. - returnUrl 변수에 값이 존재하면 returnUrl 배열의 두번째 값을 location.href에 지정한다. (자바스크립트에서 exec함수를 사용하면 정규표현식의 괄호안 부분에 일치한 부분이 결과배열의 두번째 값에 들어간다.)
- returnUrl 변수에 값이 존재하지 않으면 “/” 를 location.href에 지정한다.
- 정규표현식
returnUrl = /url=(https?:\/\/.+)/.exec(location);
location.href = returnUrl ? returnUrl[1] : "/"'
- 공격용 페이로드를 구상한다. 정규표현식
/url=(https?:\/\/.+)/
를 잘 살펴본다. 웹 페이지의 location에url=https://
와 같은 문자열이 포함되어 있으면 정규표현식과 매치(match)될 것이다. 즉, 다음과 같은 형태면 returnUrl 값이 https://exploit-0ad000f4045f11d483ed371001740054.exploit-server.net/ 가 되어, 되돌아가기 버튼을 눌렀을 때 exploit서버로 리다이렉트될 것이다.
https://0a2f009604c41143839b383100e10064.web-security-academy.net/post?postId=4&url=https://exploit-0ad000f4045f11d483ed371001740054.exploit-server.net/
Chrome의 디버거로 확인해본 모습
- 웹 브라우저로 위의 URL로 접속해보면 잠시 뒤 랩이 풀린다.