본문 바로가기

웹 해킹

[주통기반] 로컬 웹 서버 취약점 찾기 (크로스사이트 스크립팅)

XSS는  사용자의 입력이 웹 서비스 이용 시에 응답에 그대로 포함되어 출력될 경우 발생할 수 있습니다.

웹 브라우저에서 실행가능한 스크립트를 입력하여 응답에 포함될 경우 웹 브라우저는 해당 스크립트를 실행하게 되어 사용자가 특정 행동을 하게 할 수 있습니다.

스크립트에 쿠키 값을 공격자에게 보내는 코드를 작성하거나 악성 콘텐츠를 다운받는 코드를 작성 시 클라이언트 측에서 해당 동작을 수행하게 할 수 있습니다.

 

점검 방법 : 삽입한 스크립트가 클라이언트측에서 실행되는 지 확인합니다.

 

1. 게시글 작성

1) 메인 게시판에서 글쓰기를 통해 게시글 작성 페이지에 접속합니다.

메인 게시판

 

2) 게시글 작성 시 제목이나 내용에 스크립트를 삽입합니다. 

스크립트 삽입

 

제목에 작성 시 제목이 출력되는 메인 게시판에서도 스크립트가 실행될 것이며,

내용에 작성 시 해당 게시글을 읽으면 스크립트가 실행됩니다.

 

<script>alert(1);</script> 작성하여 해당 스크립트가 실행되는지만 확인합니다.

스크립트 태그 내에 악성 코드를 작성하면 해당 코드가 실행될 것입니다.

 

3) 게시글이 정상적으로 작성됐는지 확인합니다.

게시글 작성 확인

 

4) 해당 게시글을 클릭해 게시글을 확인하면 스크립트가 실행됩니다.

스크립트 실행

 

2. 게시글 수정

1) 나의 게시글 페이지에 들어가 원하는 게시글 수정을 클릭해 게시글 수정 페이지에 접속합니다.

나의 게시글

 

2) 게시글 수정 시 제목이나 내용에 스크립트를 삽입합니다.

스크립트 삽입

 

<script>alert(2);</script> 작성하여 해당 스크립트가 실행되는지만 확인합니다. 

이번에도 제목에 작성하면 메인 게시판에서도 스크립트가 실행될 것이며, 내용에 작성 시 해당 게시글 확인 시 스크립트가 실행됩니다.

 

3) 게시글이 정상적으로 수정됐는지 확인합니다.

게시글 수정 확인

 

4) 해당 게시글을 클릭해 게시글을 확인하면 스크립트가 실행됩니다.

스크립트 실행

3. 파일 업로드

1) 게시글 작성 수정 페이지에 접속합니다.

게시글 수정 페이지

 

2) 파일 이름을 클라이언트 측에서 실행가능한 스크립트로 작성하여 업로드합니다.

스크립트 삽입

 

3) 해당 게시글 확인 시 스크립트가 실행됩니다.

스크립트 실행

 

파일명이 게시글을 불러오며 출력됩니다.

파일명을 스크립트로 작성하여 HTML에 삽입되어 해당 스크립트가 실행되게 됩니다.

삽입된 스크립트 확인

 

[대응 방안]

HTML Entity를 사용하여 HTML 특수 문자들을 처리합니다.

예를 들어 '<' 문자를 &lt; 로 정해진 entity로 바꾸어줍니다. 저장될 때는 &lt; 로 저장되며 웹 브라우저에서 화면에 출력시켜줄 때는 '<' 로 바뀌어 출력됩니다. 

이렇게 하면 사용자 입력을 그대로 사용할 수 있고 태그를 생성할 수 있는 <,> 문자에 대해 태그를 생성하지 않고 그냥 화면에 출력시켜줄 수 있습니다.

 

특수문자 처리

 

해당 코드처럼 입력받은 제목, 내용에 대해 특수문자를 처리해줍니다.

게시글 작성, 수정 코드에 추가해주면 될 것 같습니다.

 

파일 이름 부분도 해당 코드를 추가해주었습니다.

특수문자 처리

 

최소한 태그를 생성하고 스크립트 실행하기 위한 특수문자인 <, >, ', " 문자들은 필수적으로 처리해줍니다.

추가적인 필터링은 HTML Entity를 검색하시면 모든 문자에 대해 정의된 Entity를 확인할 수 있고 적용해주시면 됩니다.

[대응 후]

게시글 작성 시 제목과 내용 파일 이름에 스크립트를 삽입하여 봅니다.

스크립트 삽입

 

제목에 입력된 스크립트가 실행되지 않습니다.

게시글 확인

 

해당 게시글을 확인해도 스크립트가 실행되지 않습니다.

또한, 입력한 그대로 문자를 사용할 수 있어 사용자는 해당 특수문자를 문제없이 사용할 수 있습니다.

 

게시글 수정 시에도 잘 돼는지 확인해보겠습니다.

스크립트 삽입

 

수정 후 확인

 

마찬가지로 원하는데로 필터링되어 스크립트가 실행되지 않는 것을 확인할 수 있습니다.

DB 내용

 

화면에는 정상적으로 입력한 특수문자가 출력되지만 저장시에는 변경시킨 문자열로 저장되는 것을 확인할 수 있습니다.

 

이렇게 스크립트 실행을 위해 필요한 특수문자를 필터링하여 XSS 공격을 막을 수 있습니다.