본문 바로가기
자격증/정보보안기사

Cross Site Scripting(XSS)이란?

by 푸고배 2021. 11. 27.

 Cross Site Scripting(XSS) 공격이란? 

Cross Site Scripting(XSS) 공격은 악의적인 사용자가 공격하려는 사이트에 악성 스크립트를 주입하는 것이다. 공격에 성공하면 사이트에 접속한 사용자는 악성 스크립트를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등 민감한 정보를 탈취한다.

 

공격 방법에 따라 Stored XSS와 Reflected XSS로 나뉜다. Stored XSS는 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장되어 실행되는 방법이고, Reflected XSS는 보통 URL 파라미터(특히 GET 방식)에 스크립트를 넣어 서버에 저장하지 않고 즉시 스크립트를 만드는 방식이다. 후술된 내용 대부분은 Stored XSS라고 생각하면 된다. Reflected XSS의 경우 브라우저 자체에서 차단하는 경우가 많아 상대적으로 공격을 성공시키기 어렵다.

 

크로스 사이트 스크립팅이라는 이름 답게, JavaScript를 사용하여 공격하는 경우가 많다. 공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트드리 XSS에 대한 방어 조치를 해두지 않아 공격을 받는 경우가 많다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파된다. 심지어는 닉네임에 코드를 심기도 한다.

 

물론, HTML을 사용하는 것이기 때문에 Text-Only 게시판이나, BBCode를 이용하는 위키위키 등에서는 XSS가 발생할 일은 없다. 

 

주로 CSRF를 하기 위해서 사용되기 때문에 종종 CSRF와 혼동되는 경우가 있으나, XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시키는 것으로 다르다.

 

 XSS 공격 종류 

Stored(or relentless) XSS Attacks

XSS 취약점이 있는 웹 서버에 악성 스크립트를 입력해두고 방문자가 해당 페이지를 읽는 순간 방문자의 브라우저를 공격하는 방식이다. 일명 저장 방식이다.

 

Reflected CSS Attacks

특정 파라미터 값을 통해서 공격하는 방식으로 검색, 에러메시지, URL 등 사용자로부터 입력한 값을 받아 브라우저에게 응답할 때 전송되는 방법이다.

 

DOM(Document Object Model) based CSS Attacks

Document Object Model의 약자로 DOM 객체를 포함하는 자바스크립트 등을 이용하여 데이터 접근 시 검증되지 않은 입력값이 자바스크립트를 통해 삽입되어 발생하는 취약점을 이용하는 방식으로 URL을 통해 사용자를 공격한다.

 공격 기법 

한국에서 가장 많이 사용되는 IE 기준으로 작성한 것이다.

따라서 크롬, 파이어폭스 등의 브라우저나 최신 브라우저 환경에서는 작동하지 않을 수도 있다.

 

스크립트 태그

  • 방법 : 스크립트 태그로 자바스크립트를 실행한다.
  • 예제
<script>alert('XSS');</script>
  • 설명 : 스크립트 태그의 스크립트를 실행시킨다. 안타깝게도, 매우 정직한 방법이라 대부분의 사이트에서 막는 경우가 많다. 브라우저단에서 필터링 해주는 경우도 있다.

 

자바스크립트 링크

  • 방법 : 링크 태그로 자바스크립트를 실행한다.
  • 예제
<a href="javascript:alert('XSS')">XSS</a>
  • 설명 : 브라우저에서 about: 링크와 같이, javascript: 로 시작하는 링크는 스크립트를 실행시킨다. 스크립트 태그와 같이, javascript: 를 필터링하는 경우가 많아 많은 사이트에서 막는다.

 

이벤트 속성

  • 방법 : 이벤트 속성을 사용한다.
  • 예제
<img src="#" onerror="alert('XSS')">
  • 설명 : 이벤트 속성으로 스크립트를 실행할 수 있다. 주로 on 으로 시작하는 속성이 이벤트 속성이다. 자주 사용되는 이벤트 속성으로는 onload onerror onclick 등이 있다. 물론, 이 방법 역시 '자바스크립트 링크' 방법만큼 많이 막혔다.

 

블랙리스트 우회

  • 방법 : 알려지지 않은 태그와 속성들을 사용한다.
  • 예제 :
<ruby oncopy="alert('XSS')">XSS</ruby>
  • 설명 : 블랙리스트 방식으로 막는 사이트에 사용할 수 있다. 위의 방법들보다는 적게 막혔으나, 여전히 최근 웹사이트들에서는 화이트리스트 방식 차단이 대부분이라, 막혔을 가능성이 높다.

 

내용 난독화

  • 방법 : 따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고, HTML 인코드를 하여 난독화한다.
  • 예제 :
<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#xA;&#x61;&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>
  • 설명 : 일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한다. 여기에서는 '자바스크립트 링크' 방법과 사용하였지만, 당연히 다른 방법과 함께 사용할 수 있다.

 

스크립트 난독화

  • 방법 : 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) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (o^_^o))+ (゚Д゚) [゚Θ゚]+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚) .゚ー゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (゚ー゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) ['c']+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (o^_^o)+ (゚Д゚) .゚ー゚ノ+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) .゚Θ゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
  • 설명 : 스크립트를 일본어를 사용한 이모티콘으로 난독화한다. 스크립트 실행은 가능하지만, document.cookie와 같은 단어를 막을 경우 사용하면 된다.

 

 방어 방법 

XSS는 데이터를 입력할 때와 출력할 때, 모두 필터링하고, 클라이언트에도 막을 수 있을만한 수단을 구성해놓는 것이 좋다. 

  • 입력 필터
  • 출력 필터
  • 쿠키의 보안 옵션 사용
  • 콘텐츠 보안 정책(Content Security Policy, CSP) 사용

 

 OWASP에서 발표한 XSS 공격을 방지하는 7계명 

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

 

참고자료 : 나무위키

 

What is XSS cross site scripting❓ - types and protection

👉In this article, you will learn what XSS is. What are the types of cross-site scripting. Why is it dangerous and how to protect

www.wallarm.com

 

크로스 사이트 스크립팅(Cross Site Scripting, XSS)을 통한 웹 공격

XSS 즉, 크로스 사이트 스크립팅은 웹어플리케이션에서 볼 수 있는 취약점 중 하나 입니다. 웹페이지에 ...

blog.naver.com

 

반응형

댓글