보안개구리

[게시판 실습] - 파일 다운로드 (1) 파일 다운로드 시 지정된 경로 우회 가능 본문

웹 진단/게시판 실습

[게시판 실습] - 파일 다운로드 (1) 파일 다운로드 시 지정된 경로 우회 가능

보안개구리 2024. 6. 12. 12:22

[설 명]

 공격자는 파일 다운로드 시 애플리케이션의 파라미터 값을 조작하여 웹 사이트의 중요한 파일(DB 커넥션 파일, 애플리케이션 파일 등) 또는 웹 서버 루트에 있는 중요한 설정 파일(passwd, shadow 등)을 다운받을 수 있다. 또한 cgi, jsp, php 등 파일 다운로드 기능을 제공해 주는 애플리케이션에서 입력되는 경로를 검증하지 않는 경우 임의의 문자(../.. 등)나 주요 파일명의 입력을 통해 웹 서버의 홈 디렉터리를 벗어나서 임의의 위치에 있는 파일을 열람하거나 다운로드하는 것이 가능하다. 파일 다운로드 시 허용된 경로 외 다른 경로의 파일 접근을 방지하여 공격자가 임의의 위치에 있는 파일을 ㅇ려람하거나 다운로드하는 것을 불가능하도록 하여야 한다.

 

[점검 내용]

 웹 사이트에서 파일 다운로드 시 허용된 경로 외 다은 경로의 파일 접근이 가능한지 여부 점검

 

[점검 기준]

 다운로드 파일이 저장된 디렉터리 이외에 접근이 가능한 경우 취약

 

[대응 방법]

 * 다운로드 파일 이름을 DB에 저장하고 다운로드 수행 시 요청 파일 이름과 비교하여 적절한지 확인하여 사용자가 조작할 수 있는 변수를 제거함

 * 다운로드 애플리케이션 소스 파일을 수정하여 파일을 다운받을 수 있는 디렉터리를 특정 디렉터리로 한정하고 이 외의 다른 디렉터리에서는 파일을 다운로드할 수 없도록 설정해야 함

 * PHP를 사용하는 경우 php.ini 에서 magic_quotes_gpc를 on으로 설정하여 .\./와 같은 역 슬러시 문자 입력 시 치환되도록 설정

 * 파일 다운로드의 절대 경로 설정 및 DocBase의 상위경로 또는 타 드라이브로 설정을 변경함

 * 다운로드 경로 정보를 자바스크립트나 js 소스에서 확인할 수 없게 제한하며, 웹 서버 서블릿 내부 또는 별도의 설정 파일에서 관리

 * 다운로드를 제공하는 페이지의 유효 세션 체크 로직 필수 점검 

 

[진단 과정]

1) 'hacker' 계정으로 로그인 후 게시판 메뉴로 이동합니다. 

게시판 메뉴 이동

 

2) 게시판 메뉴 이동 후 게시글 작성 시 임의의 파일을 업로드 후 게시글을 저장합니다.

게시글 작성

 

3) 작성된 게시글을 조회 후 첨부된 파일을 다운로드합니다. 파일 다운로드 시 프록시를 통하여 요청값을 확인합니다.

파일 다운로드 시도

 

4) 프록시 도구를 통하여 요청값 확인 시 2개의 파라미터 값을 전송하는 것을 확인할 수 있는데 realFileName은 실제 저장공간에 저장된 파일명을 말하며, originalFileName은 업로드 시 파일명을 말합니다.

 즉 cat.jpg라는 파일을 업로드할 경우 cat.jpg라는 파일명은 originalFileName이 되고 똑같은 파일명이 여러 개 업로드될 경우 중복을 방지하기 위하여 realFileName이라는 것을 만들어 저장공간에 저장을 합니다.

요청값 확인
실제 저장공간에 저장된 파일명

 

5) 따라서 파일 다운로드 취약점을 실습 시 디렉터리 위치를 변경하기 위해서는 originalFileName이 아닌 realFileName 파라미터를 대상으로 실습을 진행해야 합니다. realFileName 파라미터 값에 ../index.jsp를 입력하여 index.jsp 파일 다운로드를 시도합니다. 디렉터리 이동 및 index.jsp 페이지가 정상적으로 다운로드됨을 확인하였습니다.

파일 다운로드 취약점 확인 및 index.jsp 파일 호가인

 

6) 또한 절대경로 입력을 통하여 C드라이브 내 콘솔 히스토리 파일 다운로드 시 파워쉘 히스토리 내역도 다운로드가 가능함을 확인하였습니다.

절대 경로를 통한 이동 확인

 

7) 소스코드내 디렉터리 이동 문자(.../ \\ /)를 입력 시 잘못된 파일 경로입니다 라는 메시지가 출력되도록 검증 로직을 추가하였고 파일 다운로드 가능한 디렉터리는 upload로 한정했습니다.

소스코드 수정

 

8) 소스코드 수정 후 다시 파일 다운로드 시도 시 이전과는 달리 잘못된 파일 경로라는 메시지가 출력되며 파일 다운로드에 실패한 것을 확인하였습니다. 인코딩하여 요청 시에도 역시 파일 다운로드가 불가능함을 확인하였습니다.

파일 다운로드 실패 (1)
파일 다운로드 실패 (2)