XSS(Cross-Site Scripting) 이란 SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법중 하나로, 권한이 없는 사용자가 악의적인 용도로 웹 사이트에 스크립트를 삽입하는 공격 기법을 말합니다. 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 부릅니다.
XSS는 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타나며, 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되어, 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취합니다.
1995년에 Javascript가 발표된 이후 2000년경 'MySpace'라는 플랫폼에서 XSS 취약점이 처음으로 보고되었으며, 20년여가 지난 지금도 XSS는 취약점이 발생하고 관련 공격이 발생하면서 꾸준히 웹 취약점 빈도수 상위 10위권에 들고있습니다. 공격기법이 오래된 만큼 보안기법들도 계속 연구되어 발표되고 있으나 그만큼 우회기법들도 생겨나고있고 자바스크립트가 계속 광범위하게 사용되면서 여전히 취약한 곳이 많은 것으로 보고되고 있습니다.
XSS는 자바스크립트를 사용하여 공격하는 경우가 가장 많고, 사용자의 세션을 공격자의 서버로 전송해서 탈취하거나 악성코드가 있는 페이지로 리다이렉트 시키는 방식으로 공격이 주로 행해집니다. 그 외에도 자바스크립트를 활용해서 내부 네트워크 포트스캔과 같은 공격도 가능합니다.
※ XSS의 공격 순서
1. 해커가 사전에 만든 웹페이지에 사용자가 브라우저로 엑세스를 시도
2. XSS공격 link가 포함된 웹페이지가 브라우저에 표시
3. 사용자가 link를 클릭
4. 사용자가 느끼지 못하는 사이 취약한 사이트에 있는 해커의 스크립트에 엑세스 됨
5. 사용자의 웹브라우저 상에서 해커의 스크립트가 실행
※ XSS의 종류
XSS는 크게 Reflected-XSS, Stored-XSS 두 종류로 나뉘며, 사용자의 브라우저가 악성 스크립트를 실행하게 하거나 그방식에 따라 나뉩니다.
Reflected XSS
- URL의 변수 부분처럼 스크립트 코드를 입력하는 동시에 결과가 바로 전해지는 공격기법
- 반사된 XSS는 피싱 공격의 일부로 자주 사용되며 악용하기도, 차단하기도 가장 쉬움
- 공격자가 HTTP 요청에 악성 콘텐츠를 주입하면 그 결과가 사용자에게 "반사되는" 형태
- 링크를 클릭하도록 피해자를 속이고, 유인해 세션을 하이재킹 할 수 있는 공격
- 반사된 XSS는 피싱 공격에서 가장 많이 사용됨
Stored XSS
- 가장 일반적인 XSS공격 유형
- 정상적 평문x -> 스크립트 코드를 입력
- 사용자가 게시물을 열람시, 공격자가 입력해놓은 악성 스크립트가 실행되어 사용자의 쿠키 정보가 유출되거나, 악성 스크립트가 기획한 공격에 당함
- 저장된(지속적) XSS공격은 공격자가 웹 애플리케이션을 속여 데이터베이스에 악성코드를 저장하도록 하는 수법으로,
서버에 저장된 악성코드는 시스템 자체를 공격 할 수 있으며 웹 앱 사용자 상당수 또는 전체에 악성 코드를 전송할 수 있음
- 일반적인 예로는 블로그 댓글에 악성코드를 게시하는 것
- 지속적(저장형) XSS 가장 위험한 XSS공격 유형
※ XSS 대응 방안
사용자의 입력에 대해서는 무조건 의심을 하고 검증하는 작업이 필요합니다. 즉, 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 하는데요. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 합니다.
1) 입력 값 제한
사용자의 입력값을 제한하여 스크립트틀 삽입하지 못하도록 해야 합니다.
2) 입력 값 치환
XSS 공격은 기본적으로 script 태그를 사용하기 때문에 XSS 공격을 차단하기 위해 태그 문자(<, >) 등 위험한 문자 입력 시 문자 참조(HTML entity)로 필터링하고, 서버에서 브라우저로 전송 시 문자를 인코딩 합니다. 예를 들어, 문자 “<”는 동일한 의미의 HTML “<” 로 변경합니다.
HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한 의미를 가지지 않으며, 단순한 문자로 처리됩니다. 이렇게 인코딩하면 사용자는 script 가 문자 그대로 보이지만 HTML 문서에서는 <script> 로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로 해석되어 실행되지는 않습니다.
3) 스크립트 영역에 출력 자제
이벤트 핸들러 영역에 스크립트가 삽입되는 경우 보호기법들을 우회할 수 있기 때문에 사용자의 입력을 출력하는 것을 최대한 자제해야 합니다.
4) 라이브러리 이용
XSS를 막아주는 Anti XSS 라이브러리를 여러 회사에서 제공하는데 이 라이브러리를 사용하면 손쉽게 XSS를 방어할 수 있습니다. XSS 라이브러리를 사용하는 것은 서버 단에서 개발자가 추가하는 것이고, 사용자들이 각자 본인의 브라우저에서 악의적인 스크립트가 실행되지 않도록 방어하는 것이 중요합니다.
방문하는 모든 사이트가 안전하다는 보장이 없기 때문에 브라우저 확장 앱 중 Anti XSS 를 해주는 애플리케이션을 설치하고 방어하여야 합니다.
개인이나 소규모 단체가 만든 것 보다는, 전문적인 보안 업체나 거대 기업에서 만든 것이 공신력있고 편하기 때문에, OWASP Antisamy이나 NAVER Lucy XSS Filter, ESAPI 등을 이용하는 방법이 있습니다.
※ XSS 공격을 방지하는 7계명
1. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는것을 허용하지 않는다.
2. 신뢰할 수 없는 데이터는 검증을 하여라.
3. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라.
4. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라.
5. CSS의 모든 신뢰할 수 없는 값에 대해서 검증하여라.
6. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증하여라.
7. HTML 코드를 전체적으로 한번 더 검증하여라.
> 출처
https://noirstar.tistory.com/266
https://lucete1230-cyberpolice.tistory.com/23
https://cosyp.tistory.com/243