웹해킹

XSS 공격 대응방안

무너박사 2024. 6. 30. 01:17

오늘은 XSS(크로스 사이트 스크립팅) 취약점에 대한 대응방안을 알아보겠습니다.

사실 이 내용은 저번 'XSS 기법' 게시글에서도 간단히 했지만 덧붙이고 싶은 내용이 있기에 따로 포스팅 합니다.

 

<지난 게시물>

https://jamesbexter.tistory.com/entry/XSSCross-site-scripting%EA%B8%B0%EB%B2%95

 

XSS(Cross-site scripting)기법

이번시간에는 XSS(크로스 사이트)  일명 '크사' 라고 불리는 공격에 대하여 간단히 알아보겠습니다. -XSS 공격이란?-공격방식1. Stored XSS2. Reflected XSS3. DOM Based XSS-예방법1. HTML Entity2. Black list , White l

jamesbexter.tistory.com

 


1. HTML Entity

XSS 에 사용되는 주요 특수문자 < > ' " 등을 전부 HTML Entity 로 바꾸는것입니다.

페이지에선 특수문자로 보이지만 스크립트 상으로는 &lt; 같은 다른 문자로 바뀌게되어 스크립트 삽입을 막는것입니다.

 

<XSS 에 사용되는 주요 특수문자 10가지의 Entity>

chat gpt 로 작성한 표

 


2. 블랙 리스트 기반 필터링

= 특정 단어를 못들어오게 막는 것입니다.

하지만 이 기법은 우회될 가능성이 존재합니다.

아직 발견이 안됐을뿐 우회할 수 있는 가능성이 무궁무진 하기때문에 위험합니다.

 

블랙리스트 필터링을 우회하는 방법으로는

 

1. 대소문자 혼용

만약 <script> 라는 단어 자체를 필터링해놓았다?

= <ScRipT>alert(1);</Script> 이런식으로 대소문자를 혼용하여 우회할 수가 있습니다.

 

2.단어필터링

만약 script 라는 단어를 공백으로 처리하게 해놓았다?

= <scrscriptipt> 이런식으로 작성하게 되면 script는 공백처리가되어 <script>만 남게된다.

 

3.script => xript 이런식으로 바꿔버린다면?(단어필터링 인데 공백이 아님)

= 다른태그를 통해서 <script> 를 대체할수 있다. 예를 들어 <img> 태그는 웬만하면 막아두지 않기때문에 가능!

:<img src=x onerror="alert(1);"> ..... 이벤트 핸들러를 사용하면 된다.(onload , onclcik, onmouseover....)

 

4.href 태그를 통해서도 자바스크립트 코드를 삽입할 수 있다.

= <a href="javascript:alert(1)">TEST</a>

 

5.1 < , > 꺽쇠를 금지한다면?

 

<script>
	var data ="__입력값__"
</script>

 

 

이런식으로 스크립트안에 우리가 입력하는 입력값이 들어가는경우라면 밑의 예시처럼 우회가 가능하다.

입력값 : "; alert()1; var a="
<script>
	var data=""; alert(1); var a="";
</script>

 

 

◎ 혹은 다른경우로 이벤트 핸들러를 사용할수도 있다.

<html>

       <input type="text" value="_입력값_">

</html>

이런식으로 input 태그안에 우리의 입력값이 들어가는경우엔

 

입력값: " onfocus="alert(1);" autofocus="

 

결과 : <input type="test" value="" onfocus="alert(1);" autofocus="">

이런식으로 우회가 가능하다.

 

즉! 블랙리스트 기반 필터링은 어느정도 한계가 있다.

 


3.화이트 리스트 기반 필터링

> 특정 단어만 입력되게 하는 것.

특정단어만 사용이 가능하여 보안상으로는 안전하지만 게시글같이 우리가 평소에 사용하는 서비스에선 마음껏 문자도 쓰고 /(>_<)/ 이러한 이모티콘도 사용해야 함으로 주로 사용되진 않는다.


-완벽하게 차단하는 방법이 무엇인가?

HTML 특수문자를 HTML Entity 처리만 해줘도 어느정도 xss 공격은 막을수 있지만 , 이런 티스토리 같이 html Editor 를 사용하는 곳에서는 자바스크립트를 쓸수 있어야하므로 막기가 곤란해진다.

HTML Editor 를 반드시 써야하는 상황이라면 이 절차에 따르기로 한다.

 

1. 사용자의 파라미터에서 HTML 특수문자들을 전부 HTML Entity로 치환한다.(HTML Entity)

 

2. 허용해줄 Tag 를 식별하고 그 Tag 를 다시 살린다.(화이트 리스트 기반 필터링) -> img a h1 h2 h3 같은거...

 

3. 살려준 Tag 내부의 악의적인 Event Handler 가 있는지 필터링 해준다.(블랙 리스트 기반 필터링)

 

이렇게 총 3번의 과정을 거치면 XSS 취약점이 거의 완벽히 차단이 된다!