웹 어플리케이션 보안 이슈에서 자주 언급되는 공격에 대해 알아보자
약자로는 CSS 가 맞지만 CSS 는 이미 Cascading Style Sheets 의 약자로 사용되고 있어 XSS 라고 한다.
공격자가 클라이언트 코드에 악의적인 스크립트를 주입하는 공격이다. 공격자는 사용자를 가장하여, 쿠키와 세션 토큰, 사이트에 민감한 정보들에 접근이 가능해진다
실수로 외부로부터 입력되는 파라미터에 대한 적절한 검증을 거치지 않고 페이지 내부에 포함하는 경우 발생
대부분의 웹 해킹 공격 기법과 다르게, 사용자를 대상으로 한 공격이다.
Reflected XSS, Stored XSS, DOM-based XSS 로 나뉜다
Stored/Persistent XSS: 공격자가 악성 스크립트를 웹 어플리케이션의 데이터베이스에 저장한 후, 이 스크립트가 웹 페이지에 표시될 때 희생자에게 전달됩니다. 이 유형의 XSS는 브라우저에서 저장된 스크립트가 계속해서 실행되므로, 사용자들이 공격자가 주입한 스크립트를 볼 때마다 공격이 발생합니다.
Reflected/Non-Persistent XSS: 악성 스크립트를 링크, 폼, 또는 쿼리 문자열과 같은 웹 어플리케이션에 직접 주입한다. 이 스크립트는 사용자가 특정 링크를 클릭하거나 특정 폼을 제출할 때, 서버를 통해 다시 사용자에게 반환된다.
입력 검증 및 이스케이핑: 사용자 입력값을 받을 때 반드시 입력값을 검증하고 안전한 형태로 이스케이핑(escaping)하여 웹 페이지에 표시
Set-Cookie 응답헤더에 HttpOnly 추가: JavaScript 에서의 document.cookie 에 대한 접근을 차단하는 정책
보안 헤더 사용: Content Security Policy (CSP)와 같은 헤더 사용. 실행되는 자바스크립트의 출처 도메인을 제한할 수 있음
Referrer 검증: 백엔드 단에서 request 의 referrer 를 확인하여 도메인이 일치하는지 검증
도메인 내의 타 페이지에 XSS 취약점이 있는 경우 CSRF 공격에 취약해질 수 있음
CSRF Token (Security Token): 사용자의 세션에 임의의 난수 값을 저장하고 사용자의 요청 마다 해당 난수 값을 포함 시켜 전송. 이후 백엔드에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증
두 방법 모두 XSS 취약점이 발생하면 CSRF 공격에도 취약해질 가능성이 높음