1. XSS 공격 기법 : Cross-site Scripting
WEBHACKING/web

1. XSS 공격 기법 : Cross-site Scripting

#XSS란 무엇인가?

*워게임 사이트나 가상환경에서 실행해보기 바람..

클라이언트에 대한 취약점을 이용해서 javascript, html 언어 등을 이용하고 있는 불특정 다수를 공격할 수 있다.

공격자가 악의적인 스크립트를 사용자의 웹 브라우저에 숨겨놓게 되면, 해당 사용자가 접속할 때

악성 코드가 실행된다. 사용자의 쿠키 및 기타 개인정보가 해커에게 전송될 수 있다.

: 주로 보안에 대한 지식이 없는 웹프로그래머에 의해 개발된 web어플리케이션에서 발견되는 HTTP관련 취약점이라고

한다. 따라서 방화벽, 바이러스 백신과 같은 기존의 보안대책들이 XSS 취약점을 감지하지 못할 가능성이 있다.

 

 

<특징>

 => 교차해서 스크립트를 실행한다.

 => 공격이 단순하면서도 강력하다

 => JAVASCRIPT 공격 중 하나이다.

 

 

1) Stored XSS

 :  공격자는 게시글, 쪽지, 댓글 등등 여러 곳에 자바스크립트 코드를 입력하여 작성해 놓는다.

  공격을 당하는 사람은 해당 웹 페이지를 열 때 숨겨진 자바 스크립트 코드가 실행되어 공격당하게 된다.
가장 대표적인 공격 코드는
<script>alert(1)</script> 를 삽입하는 것이고, 이것 이외에도 여러가지 공격이 존재한다.
자세한것은 xss cheat sheet를 참고하면 좋다.

 

EX) XSSGAME 2번

 

 

-> 이렇게 게시물을 올릴수 있는 게시판 사이트가 존재한다.

게시물에 스크립트 코드를 첨부해서 실행해보자.

<img src="#" onclick=alert('1')>

 

 

 

-> 이미지를 클릭하면 alert(1)이 실행된다.

-> 게시판에 이미지를 첨부해 올려서 XSS 공격을 실행하였다. 따라서 게시글, 댓글, 회원가입 창 곳곳을 실행했을때 숨겨진 스크립트가 실행되는 것이 Stored XSS 라고 생각하면 되겠다.

 

 

2)Reflected XSS

 : 실행 시킨 웹 페이지에서 자바스크립트 코드가 발생하고, get 방식 으로 url에 코드를 입력한다.

 : url 이 너무 길면 수상하므로 shorten url(짧은 url)로 script 부분이나 파라미터를 숨길 수 있다.

 : url 안에 스크립트 코드 작성시에 웹브라우저에서 자동으로 xss 공격을 방지한다.

 

 EX) XSS GAME 1번

=> 가상의 검색 엔진에서 검색을 시도하면 url에 해당 검색어가 그대로 노출이 되는 것을 확인 할 수 있다.

: 이를 통해 reflected xss 라는 용어를 이해할 수 있다. url에 자신이 날린 공격이 노출되는 것이다.

 

 

이때, query=<script>alert(1)</script>를 실행시켜주면?

 

 

이렇게 url에 포함된 스크립트를 통해서 alert()이 실행되었다.

 

* 이것을 조금만 응용해서 생각해보면, url에 스크립트 코드를 숨겨서 각종 해킹을 시도할 수 있게된다.

 

- 보통 사람들은 url의 앞 부분만 확인하고 뒤의 파라미터 부분은 확인하지 않는다.

 따라서 (https://www.xssgame.com?query=<script>window.open("https://hackeverything.com")</script>)

등을 실행했을때 엉뚱한 사이트로 리다이렉트 될거라고 예측할수 있는 사람이 많지 않을 것이라는 것이다.

 

=> 예를 들어 저 url을 문자나 메일로 뿌린 다음, 쿠키나 사용자 정보를 탈취하도록 만든 피싱 사이트로 연결되게끔 한다면 사용자는 속수무책으로 자신의 정보를 유출당할 수 밖에 없는 것이다.

 

+) 흔히 말하는 피싱사이트 의 원리가 바로 reflected XSS라고 할수 있겠다.

: 웹사이트를 만드는 기술 이외에 특별한 기술이 필요 없고, 사용자가 신뢰할 수 있는 url로 가장하기 때문에 해커 입장에서도 해킹을 시도하기도 쉽고, 사용자가 당하기도 쉬운 기술이라고 생각하면 되겠다.

 

 

 

#대응 방안

 -> 대부분 XSS 취약점을 진단할 때는 <script>alert(1)</script> 와 같은 구문을 삽입하는 경우가 많다.

 따라서 <script>,</script> 등과 같은 치명적인 구문을 삽입하였을때 이를 대체해버리는 방법이 있다.

Alttext=Replace(Alttext,"<script>","A")
Alttext=Replace(Alttext,"</script>,"B")

 -> 각각 <script>,</script> 를 A,B 로 치환할 수 있다.

 

#우회 필터링

  => 따라서 이러한 대응을 우회하기 위해서 여러가지 방법을 사용 할 수 있다.

 

   1) 대소문자 이용

: 위 필터링은 소문자에 해당하는 값만 적용되므로, 문자열에 대문자를 섞어주면 우회가 가능하다.

 <ScripT>alert("1")</ScRipT>

 

 2) HTML 태그 속성 이용

=> 깨진 이미지를 삽입하여 마우스가 특정 이미지를 지나가면 경고 메세지를 출력하도록 한다.

  <img src="#" onmouseover="alert(1);">

 

3) 문자열 분리를 이용한 우회 방법

: 특정 문자열 전체를 필터링 해버렸기 때문에 자바스크립트의 '+' 와 'eval'함수를 통해 우회한다.

 => 치환되지 않고 정상적으로 작동된다.

var inputString="aler"+"t(al"+"ert"+"(1));";
eval(inputString);

 

4) 특정한 문자열의 연속된 입력을 거부할 때

: Null Byte Injection을 사용한다.

: 문장의 종료를 나타내는 'NULL' 값을 문자열 사이사이에 삽입하게 된다. 

: URL 로 인코딩 된 널바이트 문자(%00)을 이용해 악의적인 공격자에 의해 의도하지 않은 동작을 시키는 것이다.

 문자열을 저장할 때 null 문자를 삽입하여 null 문자열이 있는 곳까지 출력하고 끝난 것으로 간주함을 이용한 공격이다.

 => 하지만 null문자 이후로는 그대로 공격이 전달되게 된다.

 

ex) webhacking.kr 23번

https://mslilsunshine.tistory.com/category/Wargame/webhacking.kr

 

=>위 포스팅은 지속적으로 업데이트 예정.