백승호 이글루시큐리티 사이버위협분석팀 차장

[아이티데일리] 지난 첫 번째 기고문에서는 입력 값 조작 공격 중 운영체제 명령 실행과 SQL 인젝션 취약점에 대해 알아보았다. 이번에는 XSS, CSRF, 파일 업로드 취약점에 대해 살펴보고자 한다.

크로스사이트 스크립팅(XSS: Cross Site Script) 취약점은 악성 스크립트를 홈페이지 게시판 또는 전자메일 등을 통해 유포하여 사용자가 해당 게시물 또는 메일을 클릭하였을 때 악성 스크립트가 실행되도록 하는 취약점이다. 공격자는 크로스사이트 스크립팅 취약점을 이용하여 사용자의 개인정보, 로그인 정보 등을 탈취하여 2차 공격에 사용할 수 있으며, 주로 사용자의 쿠키 정보를 획득하기 위해 사용한다.

취약점 확인은 홈페이지의 통합 검색 창, 게시판의 검색 창에 스크립트 구문을 입력하거나 게시판에 글쓰기 시 작성자, 이메일, 제목, 본문 등의 입력 창에 스크립트 구문을 삽입한 뒤 글 목록 또는 게시물 내용보기 상에서 스크립트 실행 여부를 확인하면 된다.

스크립트(“><script>alert("XSS");</script>) 구문을 삽입하여 취약점이 존재할 경우 스크립트가 실행됨을 확인할 수 있다.

 

공격자는 스크립트 실행을 통해 사용자의 쿠키 값을 획득한 뒤 인증 우회에 사용할 수 있으며, 웹 페이지 내의 비밀번호나 신용 카드 번호와 같은 민감한 정보를 유출시킬 수 있다. 또한 스크립트 내에 악성 프로그램을 다운로드 받는 사이트를 링크시키면, 사용자도 모르는 사이에 악성프로그램이 컴퓨터에 설치되기도 한다.

크로스사이트 스크립팅 취약점을 제거하는 근본적인 방법은 사용자로부터 입력 받는 모든 값을 서버에서 검증 후 입력 받도록 하는 것이다. 입력 값 검증은 사용자 입력으로 사용 가능한 문자를 정해놓고, 나머지 모든 문자를 필터링하는 방법을 사용해야 한다.

입력되는 특수문자는 그대로 받아들이지 말고 특수문자를 엔티티 형태로 변경해 입력 받아야 하며, 사용자가 입력한 문자열에서 <, >, (, ), #, &, “, ” 등을 replace 등의 문자 변환함수를 사용하여 &lt, &gt, &#40, &#41, &#35, &amp, &quot로 치환하여 사용한다.

다음으로 크로스사이트 리퀘스트 변조(CSRF: Cross Site Request Forgery) 취약점은 로그인 한 사용자 브라우저로 하여금 사용자의 쿠키와 기타 인증 정보를 포함하는 위조된 HTTP 요청을 웹 애플리케이션에 전송하여, 타인의 쿠키 값이나 세션 정보를 의도한 사이트로 보내거나 전송 값을 글에 삽입하여 정상 사용자가 해당 게시물 등을 클릭할 경우 홈페이지에서 같은 동작이 반복적으로 일어나도록 하는 취약점이다.

일반적으로 악용되는 태그들은 <Script>, <OBJECT>, <APPLET>, <EMBED>, <IMG> 등과 같은 것으로 페이지 내의 코드에 포함된다.

취약점을 확인하는 방법은 게시판의 글쓰기 화면에서 내용을 입력하고 확인 버튼 클릭 시 전송되는 패킷을 웹 프락시 툴을 이용해 URI와 변수 값들을 확인한다. 이후 전송되는 모든 값을 포함한 URI를 조합하여 생성한 뒤 이미지 태그를 이용하여 아래 예제와 같이 <img> 태그와 생성한 URI를 이용해 입력한 후 게시판 글 작성 시 내용 부분에 생성한 이미지 태그를 삽입하여 글을 등록한다.

<img src="http://도메인 명/write_ok.php?cmdProc=write&name=test&passwd=test&title=test&body=test" width=0 height=0>

취약점이 존재할 경우 아래 그림과 같이 해당 게시물을 클릭할 때마다 동일한 글이 반복적으로 등록되는 모습을 확인할 수 있다.

 

해당 취약점을 예방할 수 있는 최선의 방안은 모든 입력 값들을 서버 측에서 상세히 검증하는 것이다. 헤더, 쿠키, 질의 문, 폼 필드, 숨겨진 필드 등과 같은 모든 변수들을 엄격한 규칙에 의해서 검증하여 HTML을 사용할 경우 태그 내에 ?, & 등이 포함되지 않도록 필터링해야 하며 특별한 목적이 있는 경우가 아닌 이상 게시판에서 HTML의 사용을 하지 못하도록 하는 것이 안전하다. 또한 각각의 HTTP 요청 내에 예측할 수 없는 임의의 토큰을 추가하여 이 토큰값을 검증하면 대응이 가능하다.

끝으로 파일 업로드 취약점은 첨부파일을 업로드 할 수 있는 게시판에 일반적으로 허용된 파일(이미지파일, 문서파일 등) 이외에 악의적인 스크립트가 포함된 소스파일(.jsp, .php, .asp 등)을 업로드 하여 실행시킬 수 있는 취약점이다.

공격자는 파일 업로드 취약점을 이용해 악성 스크립트를 업로드하고, 업로드 된 파일이 서버 상에 저장된 경로를 확인하거나 유추한 후 이 경로를 통해 서버 상에서 스크립트를 실행시켜 쉘을 획득한다. 셀을 획득한 뒤 서버 정보 획득, 파일 열람 및 삭제, 홈페이지 변조 등 쉘의 기능에 따라 다양한 작업을 수행할 수 있으며 웹 서버를 장악할 수 있다. 여러 가지 공격 중 피해가 가장 크게 발생하는 취약점으로 소스코드 개발 시 반드시 체크하여야 하는 부분이다.

취약점을 확인하기 위한 사전 준비로 악성 스크립트 파일(asp_shell.asp)을 준비하고 악성 스크립트 파일을 복사하여 확장자를 이미지 파일(a.jpg)로 변경한다. 이는 자바 스크립트를 이용한 필터링이 적용되어 있는 경우 우회하기 위한 준비이며, 자바스크립트를 이용한 필터링을 하지 않는 홈페이지의 경우 직접 스크립트 파일을 업로드 할 수 있다.

게시판의 글쓰기 화면에서 첨부파일 또는 내용 부분 글 편집기의 이미지 업로드 기능을 이용해 글쓰기 화면에서 파일을 업로드 하거나 첨부 파일 기능이 없을 경우 게시판의 에디터 기능에 포함되어 있는 이미지 파일첨부 기능을 통해 파일을 첨부한다. 많은 홈페이지에서 에디터 기능을 사용하는데 꼭 필요하지 않은 경우는 사용하지 않는 것이 안전하다.

자바 스크립트를 통해 파일명 검증을 거친 뒤 파일이 업로드 되지 않을 경우 이미지 파일 확장자로 변경한 파일을 업로드 한 후 전송되는 패킷을 아래 그림과 같이 웹 프락시 툴을 이용하여 원래의 파일명으로 수정하여 주면 업로드가 가능하다.

 

게시물 작성 완료 후 첨부파일의 등록정보 등을 이용하여 첨부파일 경로를 확인한 뒤 해당 파일을 호출해 악성 스크립트 파일이 실행되는지 확인한다. 아래 그림은 업로드 된 웹 쉘의 실행 화면이다.

 

파일 업로드 취약점에 대한 대응방안은 다음과 같다.

1) 업로드 위치가 노출되지 않아야 하며 별도의 물리적 위치에 파일을 분리해서 저장하여야 한다.
2) 업로드가 허용된 확장자만 업로드 가능하도록 서버 측에서 필터링 하여야 한다.
3) 업로드 되는 디렉토리의 실행 권한 및 스크립트 실행 설정을 제거하여야 한다.
4) 파일을 저장할 때 파일명과 확장자를 추측할 수 없는 무작위 문자열 및 실행 불가능한 확장자로 변경하여 저장한다.

 

저작권자 © 아이티데일리 무단전재 및 재배포 금지