XSS (Cross Site Scripting)
흔한 보안 공격이다. 스크립트 태그 <script>를 사용하여 보안 공격을 수행한다. 공격 대상은 클라이언트이다. (참고로, CSRF라고 해서 공격대상이 서버인 Cross Site Request Forgery라는 것도 있다.)
서버의 응답에 <script>가 포함되어있으면 사용자의 브라우저에서 악성스크립트가 실행되어버릴 수 있다. 악의를 담아 스크립트를 작성하면, 해당 스크립트를 통해 여러 공격을 할 수 있다. 보통 쿠키나 세션을 탈취해 사용자의 권한을 얻어 공격을 수행한다.
XSS는 Stored XSS, Reflected XSS, DOM based XSS가 있다.
자세한 내용은 아래 사이트에서 공부하는 것을 강추한다.
Stored XSS
"서버에 저장된 악성 스크립트"가 존재하여 Stored XSS이다. 공격자가 웹에 악의적인 입력(악성 스크립트)을 제출하면 서버에 고스란히 저장되어 나중에 사용자에게 노출시킬 수 있다. 간단한 예시로, 게시글에 악의적인 스크립트를 올리고, 이 게시글을 다른 사용자가 조회할 때마다 악성스크립트를 실행시킬 수 있다. 해당 글에 액세스할 때마다 불특정 다수에게 노출되기 때문에, 넓은 피해를 끼칠 수 있다.
Reflected XSS
공격자가 보안이 취약한 사이트를 발견하면, 사용자 정보를 빼돌릴 수 있는 스크립트가 담긴 URL을 만든다(악성 스크립트가 URL을 통해 실행될 수 있는 사이트가 취약한 사이트다!) 그렇게 만든 위험한 URL을 일반 사용자들에게 이메일 등을 통해 퍼트려 사용자들이 그걸 클릭하면 악성 스크립트가 실행된다. 그렇게 사용자 정보를 빼돌릴 수 있다.
* 예를 들어 악의적인 URL은 다음과 같이 뒤에 붙는 쿼리에 악성 스크립트가 존재하는 URL이다.
http://vulnerable-site.com/query?keyworkd=<script>malicious-script-code</script>
XSS 공격을 막는 방법
1. 입력 데이터 검증하기
방어할 수 있는 가장 단순한 방법은 스크립트 태그의 <, > 특수문자를 HTML Entity라는 것으로 치환하는 것이다. 서버와 클라이언트측에서 문자열 데이터 중 스크립트 <, > 문자를 <와 >로 replace 처리하면 된다는 것이다. 에에 <가 뭔데? HTML 문서에서는 <가 <로 표현되어 마크업 문자와 충돌되지 않고, 사용자에게는 정상적으로 < 로 보여진다. 그것이 HTML Entity(HTML 문자참조)의 목적이며, HTML문서에서는 스크립트 코드의 <가 <라고 보여져서 일반 문자로 인식된다. 그래서 스크립트 실행이 되지 않는다.
2. HTTPOnly flag
HTTPOnly flag가 설정된 쿠키는 자바스크립트를 통해 접근할 수 없다. 세션 쿠키 접근을 방지하므로 세션 하이재킹 공격을 어렵게 만든다. 웹에서 세션 정보, 사용자 인증 토큰 및 기타 중요한 정보를 저장할 때 설정한다. 서버에서 쿠키 생성시 Set-Cookie 응답 헤더를 전송할 때 HTTPOnly 옵션을 설정하면 된다. 대부분의 웹 브라우저는 HTTPOnly flag를 지원한다.
*세션 하이재킹: 공격자가 세션 쿠키를 탈취하여 다른 사용자로 위장해 시스템에 로그인하는 공격!
3. Content Security Policy(CSP)
웹페이지에서 불러오는 리소스의 출처를 제한해(허용되는 리소스의 출처를 명시적으로 정의!), 외부 악성 스크립트의 실행을 방지한다. CSP를 통해 위에서 언급한 XSS 공격을 막을 수 있다.
CSP 정책은 웹페이지의 헤더에 설정된다. 예를들면 Content-Security-Policy: default-src 'self' https://example.com;라고 설정할 수 있는데, 'self'는 현재 도메인을 허용한다는 것이고, https://example.com는 특정 외부 도메인을 허용하는 것이다.
4. X-XSS-Protection Header
현대 웹 브라우저는 XSS 공격을 방지하기 위해 '내장된 XSS 필터'를 가지고 있다. X-XSS-Protection Header는 그러한 XSS 필터를 활성화하는 헤더 설정이다. 웹서버가 HTTP 응답 헤더를 보낼 때 X-XSS-Protection 헤더를 활성화하면 된다. X-XSS-Protection: 1; mode=block 이렇게 설정하면 된다. 1은 활성화고 0은 비활성화다. 그렇게 브라우저가 X-XSS-Protection 헤더를 수신하면 내장된 XSS 필터를 활성화하고, 악성 스크립트가 감지될 경우 페이지를 차단하거나 악성 스크립트를 제거한다.
'미분류글' 카테고리의 다른 글
[카카오 로그인 연동 1] 간단시리 카카오로그인 처리 흐름 이해하기 (0) | 2023.12.08 |
---|---|
[windows / docker / java] ./gradlew: not found (2) | 2023.12.08 |
하나의 Repo에 여러 Repo의 커밋기록 담기 (2) | 2023.11.01 |
add-apt-repository command not found 해결하기 (0) | 2023.09.07 |
ubuntu-drivers: command not found 및 Unable to locate package ubuntu-driver-common (0) | 2023.09.07 |