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

[아이티데일리] 이번 회에서는 입력 값 조작 공격의 마지막인 파일 다운로드 취약점과 보안설정이 잘못되어 피해가 발생하는 디렉토리 인덱싱, 그리고 정보누출 취약점에 대해 살펴보고자 한다.

파일 다운로드 취약점은 웹 애플리케이션에서 상대경로를 사용할 수 있도록 설정되어 있는 경우, 상대경로 표시 문자열인 “../”를 통해 허가되지 않은 상위 경로로 이동하여 시스템 주요 파일이나 소스 파일 등에 접근하여 파일을 다운로드 하는 취약점이다.

공격자는 파일 다운로드 취약점을 이용하여, /etc/passwd, /etc/shadow, /etc/host 등 시스템 정보가 포함되어 있는 주요파일 및 웹 소스 파일 또는 설정 파일을 다운로드 하여 시스템 계정 및 비밀번호, 데이터베이스 접속정보 등을 획득하여 시스템에 침투, 내부자료 유출 등 2차적인 공격에 악용할 수 있다.

취약점을 확인하는 방법은 홈페이지에서 파일을 다운로드할 수 있는 곳의 URI를 확인하여 변수 값 조작을 통해 시스템 파일이나 소스 파일의 다운로드가 가능한지 확인한다.

예를 들어, 정상 URI인 “http://도메인 명/down.jsp?Filename=파일.hwp”의 Filename의 값을 “http://도메인 명/down.jsp?Filename=./.././../../etc/./././passwd”와 같이 수정하거나 정상 URI인 “http://도메인 명/down.jsp?savePath=/upload/&Filename=파일.hwp”의 savePath 값과 Filename 값을 “http://도메인 명/down.jsp?savePath=/../../../../../etc/&fileName=passwd”와 같이 수정하여 파일이 다운로드 되는지 여부를 확인한다.

변수 조작 시 공격자는 보안장비에서 차단되는 것을 우회하기 위하여 ..../, ..//, .././, 인코딩 값 이용 등 다양한 방법으로 값을 변경하여 파일 다운로드를 시도한다.

취약점이 존재할 경우 /etc/passwd, /etc/shadow 등 시스템 주요파일이 유출되며, 웹 애플리케이션 소스 파일이 유출되어 공격자는 유출된 파일 내용을 확인하여 데이터베이스 접속정보 등 내부 접속정보를 획득 가능하며, 이를 이용해 데이터베이스에 접근하여 내부 정보를 획득할 수 있다.

보호대책으로는 파일 다운로드 시 파일명을 직접 소스 상에서 사용하거나 입력받지 않도록 하며 게시판 이름과 게시물 번호를 이용하여 서버 측에서 데이터베이스 재 검색을 통하여 해당 파일을 다운로드 할 수 있도록 하여야 하고, 다운로드 위치는 지정된 데이터 저장소를 지정하여 사용하고, 웹 루트 디렉터리 상위로 이동되지 않도록 설정한다.

PHP를 사용하는 경우 php.ini에서 “magic_quotes_gpc” 값을 “On”으로 설정하면 역 슬래쉬 문자에 대한 대응이 가능하다. 아파치는 아래와 같이 httpd.conf 파일 내의 Indexs 부분을 삭제한다.

▲ 아파치의 파일 다운로드 대응 설정

일반적으로 웹 서버에는 URL 입력 시 Default.html, index.html, index.html 등 기본적으로 호출할 파일을 지정해 놓게 되는데, 웹 루트 디렉토리에 해당 파일이 없을 경우, 디렉토리 내의 파일 리스트를 웹브라우저에 표시하게 된다. 이를 디렉토리 인덱싱 취약점이라고 한다. 공격자는 디렉토리 인덱싱 취약점을 이용하여 웹 서버 내 디렉토리의 구조를 파악하고, 주요 소스 파일 또는 설정 파일을 다운로드 하는 등 정보를 획득 할 수 있다.

디렉토리 인덱싱 취약점을 확인하는 방법은 웹 페이지 요청 시 도메인 명 하위의 파일명과 변수 명, 변수 값을 삭제하고 디렉터리 이름만 입력(끝에 ‘/’ 까지 입력) 하거나 URL 뒤에 %3f.jsp, %23.jsp를 입력하여 확인할 수 있다. 예를 들어 “http://도메인 명/data/”와 같이 입력한다.

디렉토리 인덱싱 취약점이 존재할 경우 그림과 같이 요청한 디렉토리의 파일 목록들이 나타나며 파일 열람 및 다운로드가 가능하다.

▲ 디렉토리 인덱싱 취약점 화면

또한 구글 검색을 이용한 디렉토리 인덱싱 확인 방법은 구글 검색 창에 “intitle:index of site:도메인 명”과 같이 입력하면 구글을 통해 수집된 취약점 정보가 그림과 같이 나타나게 된다.

▲ 디렉토리 인덱싱 구글 검색 화면

이와 같이 디렉토리 인덱싱 취약점에 노출 될 경우 웹 서버 내의 디렉토리 구조 및 파일 목록이 노출되며, 파일의 다운로드가 가능하여 자료 유출이 발생할 수 있다.

정보누출 취약점은 공격자들이 홈페이지를 공격하기 전에 홈페이지에 대한 여러 가지 사전 정보를 수집하게 되는데 어떠한 포트들이 열려 있는지, 웹 서버와 웹 애플리케이션 서버와 데이터베이스는 어떤 종류의 어떤 버전의 것들을 사용하고 있는지 등 다양한 정보들을 수집하여 수집한 정보를 이용해 공격을 시작하게 된다.

정보누출은 자체만으로 피해가 크지는 않지만 공격의 실마리를 제공해주는 역할을 하기 때문에 불필요한 정보를 공격자에게 제공하지 않도록 사전에 취약점 존재 여부를 확인하여 이에 대한 적절한 보안 설정을 해야 한다.

정보누출은 홈페이지의 서버설정 정보, 파일의 절대경로 등 공격에 이용될 수 있는 불필요한 데이터나 개인 정보가 노출되는 취약점이며, 개발 과정에서 작성한 주석이나 홈페이지 상에서 발생하는 에러 메시지 등을 통해 불필요하게 중요한 정보가 노출되어 공격자에게 2차 공격을 하기 위한 중요한 정보를 제공할 수 있다.

정보누출은 중요한 정보들뿐만 아니라 홈페이지에서 제공하고자 하는 정보 이외의 정보가 노출되는 것을 모두 포함한다.

정보누출 취약점을 확인하는 방법은 존재하지 않는 파일을 호출하거나 URI에 전송되는 변수 값, 검색 창, 로그인 창 등 애플리케이션에서 사용되는 값과 다른 데이터 형의 숫자 또는 특수문자를 입력하여 에러 메시지가 노출되는지 여부를 확인하는 것이다.

에러 페이지가 설정되어 있지 않거나 디폴트 에러 페이지를 사용할 경우 그림과 같이 에러 메시지에 아파치 톰캣의 버전 정보가 노출된다.

▲ 에러 메시지를 통한 톰캣 버전 정보 노출

또한 서버에서 클라이언트에게 전송하는 패킷 중에도 서버 정보가 포함될 수 있으며 이는 웹 프록시 툴을 이용하여 그림과 같이 응답 패킷 확인으로 서버 정보를 볼 수 있다.

▲ 웹 프록시 툴을 이용한 서버정보 노출

로그인 시 아이디 또는 비밀번호가 틀렸을 경우 그림과 같이 각각 다른 메시지가 출력되는 경우를 확인할 수 있는데 이 메시지를 통하여 아이디 존재 여부를 확인할 수 있으며 해커는 해당 아이디에 대한 비밀번호 무작위 대입 공격을 진행할 수 있다.

사용자의 편의성을 생각하면 어느 부분이 잘못되어 있는지 알려주는 것이 좋지만, 보안 측면에서는 안전하지 않은 방법이 된다.

정보누출 취약점이 존재할 경우 위의 예에서 확인할 수 있듯이 에러 페이지 또는 응답패킷을 통한 시스템 정보 수집이 가능해 지며, 로그인 실패 시 메시지를 통해 아이디 존재 여부를 확인하여 무작위 대입공격의 표적이 되기 때문에 사용자에게 보여주는 메시지 하나에도 신경을 써야 한다.

불필요한 정보가 노출되지 않게 하기 위해서는 로그인 시 아이디나 비밀번호가 틀린 경우 “아이디가 틀렸습니다.”, “비밀번호가 틀렸습니다.”와 같이 각각의 메시지를 출력하지 말고 “로그인에 실패 하였습니다.” 또는 “입력하신 정보가 일치하지 않습니다.” 등의 통합 메시지를 출력하도록 하여야 아이디와 비밀번호 중 어느 것이 잘못되었는지 알 수 없도록 하여야 보안상 안전하다.

또한 웹 애플리케이션의 인수에 특수문자 입력 시 “특수문자 입력 불가” 메시지를 출력하거나 에러 메시지를 설정하여 별도의 에러 페이지를 보여주도록 하여야 한다.

개발 시 오류 확인을 위해 설정했던 경로 정보와 디버그 정보 등은 개발 완료 시 최종 사용자에게 제공되지 않도록 반드시 수정해야 한다.

 

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