Published 2021. 1. 6. 13:33

XSS란?

XSS(Cross-site Scripting)는 웹상에서 가장 기초적인 취약점 공격 방법이다. 공격자가 악의적인 목적으로 공격 대상 사이트에 스크립트를 삽입하여 사이트에 방문한 사용자가 의도하지 않은 동작이 수행된다. 이를 통해 쿠키나 세션 토큰 등 민감한 정보를 탈취당 할 수 있다. CSRF와 혼동하는 경우가 있지만 XSS는 자바스크립트를 실행시키는 것이고, CSRF는 특정한 행동을 시킨다는 점에서 차이가 있다.

 

공격기법

-스크립트 태크

예제
<script>alert('XSS');</script>

스크립트 태그로 스크립트를 실행시키는 방법이다. 이는 매우 정직한 방법이라 대부분의 사이트에서 막고 있다. 브라우저 단계에서 필터링해주는 경우도 있다.

 

 

-자바스크립트 링크

예제
<a href="javascript:alert('XSS')">XSS</a>

링크 태그로 자바스크립트를 실행하는 방법이다. 브라우저에서 about: 링크와 같이, javascript:로 시작하는 링크는 스크립트를 실행시킨다. XSS를 실행시키는 것 외에도 다른 사이트로 이동하는 것을 막기 위해 아래와 같이 사용하는 경우도 있다.

<a href="javascript:;">LINK</a>

 

 

-이벤트 속성

예제
<img src="#" onerror="alert('XSS')">

태그의 이벤트 속성을 사용하는 방법이다. 주로 on으로 시작하는 속성이 이벤트 속성이다.

 

 

-블랙리스트 우회

예제
<ruby oncopy="alert('XSS')">XSS</ruby>

알려지지 않은 태그와 속성들을 사용하는 방법이다. 블랙리스트 방식으로 막는 사이트에 사용할 수 있으나 최근 웹사이트들은 화이트리스트 방식의 차단이 대부분이라 막혔을 가능성이 높다.

 

 

-내용 난독화

예제
<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#x
A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>

일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한 방법이다. 위 예제는 자바스크립트 링크 방법과 사용했지만, 다른 방법과 함께 사용해도 무방하다.

 

 

-스크립트 난독화

예제
゚ω゚ノ= /`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^_^o)+ (゚Д゚)[゚ε゚]+
(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

스크립트를 일본어를 사용한 이모티콘들로 난독화한 방법이다. 스크립트 실행은 가능하지만, document.cookie와 같은 단어를 막을 경우에 사용한다.

 

방어기법

-입력필터

자바는 적당한 XSS 필터를 만든 뒤, web.xml에 선언하여 모든 속성이 해당 필터를 거치도록 하는 것만으로도 좋은 효과를 볼 수 있다.

 

필터제작

단순히 텍스트만 입력하거나 출력하는 데 사용하는 필터는 주로 <>를 필터링 한다. 각각 &lt;&gt;로 바꿔 HTML코드가 아닌 단순 문자로 인식하게 한다.

 

  • 라이브러리 제작
    스크립트 태그와 이벤트 속성, javascript: 링크만 제대로 막아주어도 상당한 공격을 막을 수 있지만 EMBED 태그를 이용하여 XSS 공격을 하는 경우가 있으므로 다른 부분도 제대로 방어해야 한다. 일부 태그 및 속성만 막는 것 보다 일부 태그 및 속성만 허용하는 것이 더 좋은 방법이다. 전자의 경우  HTML 태그나 속성이 추가될 때마다 주기적으로 필터를 수정해줘야 하는데 HTML 표준을 주기적으로 확인하지 않는 이상 업데이트 하는 사이 공격당할 가능성이 있기 때문이다.

 

  • 라이브러리 이용
    라이브러리를 제작하지 않고 기존에 있던 라이브러리를 사용해도 좋다. OWASP Antisamy나 NAVER Lucy XSS Filter, ESAPI 등을 이용하는 방법이 있다.

 

  • BBCode 사용
    글을 꾸며야 하지만 따로 필터를 만들기 어려운 경우 BBCode를 사용할 수 있다. 주로 <>를 대체하여 []를 사용한다. 다른 방법에 비해 편하고, 안정성도 높은 편이다. 또한 HTML 코드를 단순 문자로 바꿀 수 있기 때문에 XSS가 실행될 가능성이 적다. 다만 정규식과 같이 단순히 문자열 치환으로 수정할 경우 XSS가 발생할 수 있으니 주의해야 한다.

 

-출력필터

HTML5부터 iframe의 sandbox 옵션으로 iframe 내의 자바스크립트, 폼과 같은 것의 제한이 가능해졌다.

iframe은 다른 웹사이트를 불러오는 것만 아니라 부모 창에서 마음대로 수정할 수 있기 때문에 AJAX나 PJAX 등을 포기하면서 까지 사용하지 않아야 한다.

 

 

-XSS 공격을 방지하는 7계명

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

 

 

 

 

'Study > Web Hacking' 카테고리의 다른 글

[WEB]: XSS game 02  (0) 2021.01.19
[WEB]: XSS game 01  (0) 2021.01.12
[bWAPP] Broken Auth. - Insecure Login Forms/Robots File  (0) 2020.10.31
[bWAPP] SQL Injection (Login Form/Hero)  (0) 2020.10.04
[bWAPP] SQL Injection (GET/Search)  (0) 2020.09.25
복사했습니다!