XSS (Cross-Site Scripting)
1. XSS(Cross-site Scripting)
- SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말합니다.
- 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며,보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취합니다.
- 공격 방법에 따라 Stored XSS와 Reflected XSS로 나누어 집니다.
- Stored XSS는 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방식입니다.
- Reflected XSS는 보통 URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 그 즉시 스크립트를 만드는 방식입니다.
1.1 스크립트
- 크로스 사이트 스크립팅이란 이름 답게, 자바스크립트를 사용하여 공격하는 경우가 많습니다.
- 공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많습니다.
- 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파됩니다.
- 웹 브라우저로 전송되는 악성 콘텐츠는 주로 JavaScript 코드 형태를 취하지만, HTML, Flash, 또는 브라우저가 실행할 수 있는 다른 모든 유형의 코드도 포함될 수 있습니다.
1.2 어떤 피해를 받을 수 있는가?
- XSS를 기반으로 한 공격의 종류는 거의 무한하지만, 일반적으로 다음과 같은 것들이 포함됩니다.
- 쿠키나 기타 세션 정보 같은 개인 데이터를 공격자에게 전송
- 피해자를 공격자가 제어하는 웹 콘텐츠로 리다이렉션
- 취약한 사이트를 가장하여 사용자의 컴퓨터에서 기타 악성 작업 수행
2. 왜 발생하는가?
2.1 발생 원인
- XSS 취약점은 웹 애플리케이션이 사용자 입력을 검증이나 인코딩 없이 그대로 출력하는 모든 곳에서 발생합니다.
- 이런 결함은 웹 개발에서 매우 흔하게 나타납니다.
- XSS가 발생하지 않는 경우.
- 텍스트 전용 게시판: HTML 태그를 지원하지 않음
3. Stored XSS
- Stored 공격은 주입된 스크립트가 대상 서버에 영구적으로 저장되는 공격입니다.
- 데이터베이스, 메시지 포럼, 방문자 로그, 댓글 필드 등에 저장됩니다.
- Stored 공격의 특징:
- 피해자가 저장된 정보를 요청할 때 서버에서 악성 스크립트를 검색
- 영구적으로 저장되어 여러 사용자에게 지속적으로 영향
3.1 공격 과정
- 악성 스크립트 삽입: 공격자가 신뢰받는 웹사이트에 악성 스크립트를 삽입합니다.
- 사용자 접근: 사용자가 악성 스크립트가 포함된 웹페이지에 접근합니다.
- 브라우저의 무조건적 실행: 브라우저는 스크립트가 악성인지 판단할 방법이 없어 신뢰받는 사이트의 코드로 인식하고 실행합니다.
- 권한 탈취: 악성 스크립트가 해당 사이트와 동일한 권한을 획득하여 다음에 접근 가능해집니다:
- 해당 사이트의 모든 쿠키
- 세션 토큰
- 브라우저에 저장된 민감한 정보
- HTML 페이지 내용 수정 권한
3.2 방어 방법
- XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋습니다.
- 보안은 한없이 덧대도 끝이 없고, 아래 서술한 방식으로 구성해도 기어코 뚫어버리는 사람들이 존재하기 때문입니다.
- 단순히 텍스트만 입력시키거나 출력하는 데 필터를 제작할 때, 주로 필터되는 것이
<와 >입니다.
- 각각
<와 >처럼 HTML 문자로 바꾸어서 HTML 코드가 아닌 단순 문자로 인식하게 하는 방법입니다.
- 하지만, 이 경우는 모든 HTML 태그를 막아버리기 때문에, 각종 스타일을 적용시켜야 하는 사이트에서는 맞지 않을 수 있습니다.
- 라이브러리 사용
3.3 입력 필터
3.4 출력 필터
4. Reflected XSS
- Reflected XSS의 경우 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어렵습니다.
4.1 공격 과정
- 공격자가 악성 URL 만듭니다.
- 정상 검색 URL:
https://example.com/search?q=강아지
- 악성 URL:
https://example.com/search?q=<script>alert('해킹!')</script>
- 공격자가 피해자에게 악성 URL 전달합니다.
- 이메일, 메시지, 소셜 미디어 등을 통해서 전달합니다.
- 피해자가 악성 링크를 클릭합니다.
- 피해자는 신뢰하는 사람이 보낸 링크라고 생각하고 클릭
- 브라우저가
https://example.com/search?q=<script>alert('해킹!')</script> 요청
- 취약한 웹사이트가 요청에 응답합니다.
- 브라우저가 악성 스크립트 실행
- 브라우저는 이 HTML을 신뢰받는 example.com에서 온 정상 페이지로 인식
<script>alert('해킹!')</script> 부분을 정상적인 코드로 착각하고 실행
- 결과: 경고창 뜨면서 실제로는 쿠키 탈취, 계정 정보 전송 등 발생