XSS(Cross-Site Scripting)

크리스탈 파워~UP·2021년 3월 21일
0

XSS공격이란?

XSS 공격은 악의적인 목적으로 웹 서버에 구현된 웹 애플리케이션의 XSS 취약점을 이용하여 서버 측 또는 URL에 미리 삽입 공격하려는 사이트에 악성 스크립트를 넣어두어, 해당 사이트에 접속한 유저의 브라우저에서 원치 않는 스크립트를 실행하게 되어, XSS 취약점은 문제가 되고 있는 악성 URL 배포를 통해 PC를 해킹하는 데 자주 사용될 뿐만 아니라, 피싱 문제, 인증 데이터 획득 등으로 사용자 및 조직에 심각한 위험을 초래할 수 있다

웹 애플리케이션 보안 연구재단(OWASP)에 따르면
"크로스 사이트 스크립팅(XSS)는 애플리케이션에서 브라우저로 전송하는 페이지에서 사용자가 입력하는 데이터를 검증하지 않거나, 출력시 위험 데이터를 무효화 시키지 않을 때 발생한다."라 정의하고 있음

공격종류

1. 저장 XSS공격

공격자가 XSS취약점이 있는 웹 서버에 공격용 스크립트를 입력해놓으면, 방문자가 악성 스크립트가 삽입되 었는 페이지를 읽는 순간 방문자의 브라우저를 공격하는 방식

가장 일반적으로 HTML문서에 <script>를 이용하여 스클립트 안에 악성 스크립트를 저장하는 방식이 있으며

<script>alert(document.cookie)</script>

유명 온라인 게시판, 웹 기반 이메일 및 사용자 프로필 등에 위와 같은 스크립트를 저장해두고 사용자가 페이지를 읽을 때마다 브라우저가 해당 스크립트를 실행한다.

2. 반사 XSS공격

반사식 XSS 공격은 웹 애플리케이션의 지정된 변수를 이용할 때 발생하는 취약점을 이용하는 것으로 검색 결과, 에러 메시지 등 서버가 외부에서 입력받은 값을 받아 브라우저에게 응답할 때 전송하는 과정에서 입력되는 변수의 위험한 문자를 사용자에게 그대로 돌려주면서 발생한다.

사용자가 악성 스크립트가 포함된 링크를 클릭한 순간 악성 스크립트가 사용자의 브라우저에서 실행된다.

1) 공격자는 먼저 A사이트에 XSS 취약점이 있는 것을 발견한다.
2) 민감한 정보를 획득할 수 있는 공격용 악성 URL을 생성한다.
3) 공격자는 이 URL을 이메일 메시지에 포함하여 배포한다.
4) 피해자가 URL을 클릭하면, 바로 공격 스크립트가 피해자로 반사되어 A 사이트에 관련된 민감한 정보(ID/패스워드, 세션 정보)를 공격자에게 전송한다

3. DOM기반 XSS공격

DOM환경에서 악성 URL을 통해 사용자 브라우저를 공격함.
피해자의 브라우저가 HTML 페이지를 구문 분석할 때마다 공격 스크립트가 DOM 생성의 일부로 실행되면서 공격한다. 페이지 자체는 변하지 않으나, 페이지에 포함되어 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행된다.

공격기법

  • 스크립트 태그로 자바스크립트 실행
<script>alert('hello world');</script>
  • 링크 태그로 자바스크립트 실행
<a href="javascript:alert('hello world')">링크</a>
  • 이벤트 속성으로 자바스크립트 실행
<img src='#' onerror="alert('hello world')"/>
  • 임의 태그의 이벤트 속성으로 자바스크립트 실행
<human oncopy="alert('hello world')">휴먼</human>
  • document.cookie와 같은 특정 단어를 막을 경우, 자바스크립트 난독화(ex aaaencode)를 한 태그를 삽입하여 스크립트 실행
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

XSS 취약점 예방 기술

XSS 취약점을 근본적으로 해결하기 위해서는 애플리케이션 개발단계에서 위험한 데이터 입・출력을 검증하고 인코딩하는 방법을 선택해야 한다

1.입출력값 검증 및 무효화

스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다.
출력 값을 무효화하기 위해서는 XSS 공격은 기본적으로 <script> 태그를 사용하기 때문에 XSS공격을 차단하기 위해 태그 문자(<, >) 등 위험한 문자 입력 시 문자 참조(HTML entity)로 필터링하고, 서버에서 브라우저로 전송 시 문자를 인코딩하는 것이다. HTML 문자 참조란 ASCII
문자10)를 동일한 의미의 HTML 문자로 변경하는 과정이다. 예를 들어, 문자 <는 동일한 의미의 HTML &lt;로 변경한다. HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한의미를 가지지 않으며, 단순한 문자로 처리된다. 이렇게 인코딩하면 사용자는 <script>
<script>로 보이지만 HTML 문서에서는 &lt;script&gt;로 나타나서 브라우저에서 일반 문자로
인식하고 스크립트로 해석되어 실행되지는 않는다.

<DIV STYLE="background-image: url(javascript:alert(document.cookie))">
<iframe src="악성 URL" width="0" height="0" frameborder="0"></iframe>

2. 보안라이브러리

1) AntiXSS
AntiXSS 라이브러리는 마이크로소프트사에서 개발한 공개용 XSS 취약점 예방 라이브러리. ASP.net 애플리케이션 개발환경에서 사용되며, 현재
ASP.net 4.5 이후 버전에만 사용이 가능

2) OWASP ESAPI 라이브러리
XSS 취약점을 예방하기 위해 API로 validator와 encoder가 있다. validator는 입력 값을 필터링하는 기능을 하고 있으며, encoder는 출력 값을 인코딩 및 디코딩 기능을 가지고 있다.
OWASP Antisamy
3) Naver Lucy XSS Filter
https://github.com/naver/lucy-xss-filter

3. 브라우저 확장 프로그램

NoScript는 파이어폭스 등 모질라 기반의 브라우저에서 실행되는 오픈 소스 확장 프로그램으로, 신뢰된 사이트의 자바스크립트, 플래쉬,실버라이트 및 액티브X 등 동적 스크립트만 브라우저에서 실행하도록 하여 XSS 공격을 예방할 수 있다.

XSS공격 방지 7계명

  1. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는 것으 허용하지 않는다.
  2. 신뢰할 수 없는 데이터는 검증을 하여라
  3. HTML속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 하여라
  4. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 하여라
  5. CSS의 모든 신뢰할 수 없는 값에 대하여 검증하여라
  6. URL파라미터에 신뢰할 수없는 값이 있는지 검증하여라
  7. HTML코드를 전체적으로 한번더 검증하여라.

참고자료

profile
코딩러너! 걷지말고 뛰어라~

0개의 댓글