최근 저희는 XSS 취약점과 관련된 웹 애플리케이션 보안. 이번에는 또 다른 위험에 대해 알려드리고자 합니다.
이 백서에서 논의된 취약점은 오랫동안 우리와 함께 해왔으며, 그 단순성 때문에 종종 과소평가되거나 심지어 알려지지 않은 경우도 있습니다. 웹 애플리케이션 개발자.
거의 모든 웹 애플리케이션에는 클릭하면 원래 페이지가 있는 탭이 닫히지 않도록 새 탭에서 열리는 링크가 포함되어 있습니다. 이는 제작자가 사용자가 애플리케이션에서 최대한 많은 시간을 보내기를 원하기 때문에 선호되는 동작입니다.
이 취약점을 악용하는 공격은 소위 "리버스 탭네이빙"입니다. 대상 페이지에서 링크된 페이지가 피싱 사이트 등으로 해당 페이지를 대체할 수 있는 공격입니다.
공격 시나리오
- 피해자가 target="_blank"를 통해 링크를 여는 것으로 알려진 Facebook을 사용한다고 가정해 보겠습니다,
- 가짜 바이럴 페이지를 만듭니다,
- Facebook 로그인 페이지처럼 보이는 피싱 웹사이트를 만듭니다,
- 아래 내용을 입력하세요. 코드 바이러스 페이지에서 발견된 XSS 취약점 등을 통해
window.opener.location = 'https://phishing-website/facebook.com';
- 피해자가 Facebook에서 바이러스 페이지로 연결되는 링크를 클릭합니다,
- 바이럴 페이지는 페이스북 탭을 피싱 웹사이트로 리디렉션하여 사용자에게 다시 로그인할 것을 요청합니다.
따라서 웹 API에서 창 개체를 통해 감염된 대상 페이지의 상위 탭을 변경할 수 있습니다. 일반적으로 공격은 발견된 여러 취약점과 피싱 사기를 동시에 사용하는 방식으로 이루어집니다.
문제
링크를 사용하여 브라우저에서 새 탭을 열 때 target="_blank"
속성을 추가하면 새 탭에서 '리퍼러'에 액세스할 수 있습니다. 더 구체적으로 말하면 오프너
속성의 창
객체를 호출하면 해당 객체를 연 창, 즉 상위 페이지에 대한 참조를 반환합니다.
이는 창 열기()
함수. 이 속성에 액세스하면 상위 페이지를 쉽게 바꿀 수 있습니다. 일부 최신 브라우저에서는 window.opener
함수를 대상 탭에서 null
를 사용하여 이 동작을 방지할 수 있습니다.
코드 예시
<code> <a href="https://github.com" target="_blank">GitHub로 이동 - 감염된 링크</a>
const if (링크) link[0].onclick = () => { { if (window) window.opener.location = 'https://stackoverflow.com' }
위에서는 감염된 링크를 볼 수 있는데, 원래는 GitHub 페이지가 있는 새 탭이 열리지만 '부모' 페이지가 Stackoverflow 사이트로 변경됩니다.
라이브 예제
1. HTML 링크
추가 rel="noopener noreferrer"
를 <a>
태그.
그리고 rel
속성은 연결된 리소스와 현재 문서 간의 관계를 정의합니다.
noopener
은 브라우저에 대상을 연 부모에 대한 액세스 권한을 부여하지 않고 대상을 탐색하도록 지시합니다. 대상 탭 창 열기
는 null
.
노레퍼러
는 브라우저가 타깃으로 이동할 때 주소나 다른 값을 참조자로 부모에게 보내는 것을 방지합니다. 참조
HTTP 헤더. 이 HTTP 헤더 이름은 의도적으로 "referrer"로 철자가 잘못 표기되어 있습니다.
2. JavaScript 링크
JavaScript의 경우 창 열기
함수에 값을 추가할 수 있습니다. noopener
그리고 노레퍼러
에서 창 기능
매개변수의 창 열기
기능을 사용할 수 있지만 브라우저에 따라 다르게 반응할 수 있으므로 창 열기
as null
사용 후 창 열기()
함수입니다.
자세히 보기:
이 글이 흥미로웠다면 Github에서 Lukasz를 팔로우하세요: https://github.com/twistezo