XSS의 정의
XSS란 "Cross Site Scripting"의 약자로 사이트에 스크립트를 삽입하여 클라이언트 측에서 악의적인 실행이 일어나도록 하는 해킹 공격 기법입니다. 약자가 CSS가 되어야 할 것 같지만, 이미 CSS는 더 많이 쓰이는 'Cascading Style Sheets'이라는 언어가 있기 때문에 혼란을 줄이기 위해서 XSS로 표현하고 있습니다. 잘 알려진 해킹 공격 기법 중 매우 기초적이며 범위가 넓어 빈번하게 일어날 수 있는 취약점입니다. 공격 방식은 공격자가 취약점이 있는 사이트에 악의적인 스크립트를 심어놓거나 페이로드를 작성해서 사이트 또는 링크를 피해자가 방문하게 되면 클라이언트측 브라우저에서 해당 스크립트를 해석하면서 악의적인 공격이 실행됩니다. 공격 대상은 웹 서비스를 이용하는 사용자가 대상이 됩니다. 해당 사용자가 관리자 권한을 가진 대상이 될 수도 있습니다. 웹 브라우저에서 해석되는 스크립트 언어(ex:자바스크립트)를 입력하여 공격하는 경우가 많고 위협적이지만 HTML이나 CSS를 삽입하는 것도 XSS의 범주에 포함됩니다.
공격 기법의 종류
XSS의 공격 기법에는 3가지 방법이 널리 알려져 있습니다. Stored XSS, Reflected XSS와 DOM Based XSS입니다.
- Stored XSS - 스크립트를 삽입한 내용이 웹 상에 저장되는 경우 공격하는 기법입니다.
- Reflected XSS - 입력값이 반사되는 것을 이용하여 페이로드를 URL 형태로 작성하여 공격하는 기법입니다.
- DOM Based XSS - DOM을 활용하여 웹에서 입출력이 발생하는 것을 악용하는 XSS 공격 기법입니다.
Stored XSS는 악성 스크립트 페이로드가 웹 페이지 내에 저장되며 해당 페이지에 희생자가 접근하게 되면 공격이 발생되는 방식입니다. Reflected XSS는 입력 값이 웹에 다시 그대로 나타나는 것을 활용합니다. 악의적인 입력값(페이로드)이 들어가도록 하는 링크를 제작하고 희생자가 해당 링크를 들어가게 되면 공격이 발생됩니다. DOM Based XSS는 Document Object Model을 사용하는 경우라면 별도로 DOM Based XSS로 구분합니다.
위험성
Reflected XSS의 경우 피해자가 해당 URL로 들어와야 하는 한계가 있어서 Stored XSS에 비해서는 그 위험성이 잘 강조되지는 않습니다. 물론, Stored XSS의 경우 XSS 공격 페이로드가 삽입된 페이지에 접근하는 사람이 많을 수록 그 피해 범위가 늘어나므로 더 위험한 것은 사실입니다. 다만, XSS는 발생하는 경우가 있다면 최대한 꼼꼼하게 막아주는 것이 XSS와 연계하여 더 위협적인 공격을 할 수 있는 경우를 사전에 차단할 수 있습니다. XSS로 발생할 수 있는 문제들은 아래와 같습니다.
- 사용자의 개인정보 노출
- 불편한 웹 사용 경험
- 쿠키 접근, 권한 탈취(세션 하이재킹)
- 악성코드 다운로드
- 피싱사고
- CSRF 공격 위협
- 키로깅
대응법
XSS는 범위가 넓은 만큼 개발 과정에서 보안을 고려하기에 꽤나 귀찮고 번거로울 수 있습니다. 하지만, 공격 가능성과 활용도가 다양한 만큼 HTML Entity 치환과 화이트리스트/블랙리스트 필터링을 통한 입력값 검증을 전체적으로 사용해주어 사용자의 입력값을 잘 걸러줄 필요가 있습니다.
- 입력 값 검증, 필터링 또는 특수문자 치환
- HTML Entity 인코딩
- innerHTML 사용 자제
- 쿠키 httpOnly 옵션 활성화
- Content Security Policy 사용
- 인증 강화
- 쿠키에 중요 정보 저장 지양
- 보안성이 검증된 API 사용
또한, 공격 대상이 클라이언트(사용자)인 만큼 개인 사용자들도 XSS 공격으로 인한 피해를 최소화 하거나 예방하기 위해서는 아래와 같은 노력을 할 필요가 있습니다.
- 주기적으로 패스워드 변경
- 브라우저 최신 패치
- 수상한 링크 접근 지양
- 브라우저 보안 옵션 등급 상향
'💻Information Security' 카테고리의 다른 글
CSRF(Cross Site Request Forgery)이란? (1) | 2024.01.21 |
---|---|
XSS 대응방안에 대한 자세한 설명 (1) | 2024.01.20 |
SQL Injection이란? (0) | 2024.01.18 |
Root와 Web Root, 헷갈리는 '루트'란? (0) | 2024.01.15 |
JSON과 JWT! (JSON Web Token) (0) | 2024.01.14 |