크리핵티브 웹 해킹 기본교육

홈 > 모의해킹 연구실 > rehacktive web hacking

rehacktive web hacking

파일 다운로드 취약점에 대한 이해

하얀운동화 0 210

2372228165_5968b40c9cc8b_15000340606422.

 

웹의 구조상 원격지의 서버 내 임의의 위치에 존재하는 파일을 볼 수 있는 것은 불가능하나, "파일 다운로드 취약점"이 존재할 경우 그것은 가능해진다...

이런 이유로 "파일 다운로드 취약점"은 필자가 가장 좋아하는 웹 취약점 TOP 3 중 하나이며, 웹 해킹의 끝판 대장이라 할 수 있는 "파일 업로드 취약점"을 도출해낼 수 있게 하는 최고의 정보꾼 역할을 한다.

이번 연재 강의에서 "파일 다운로드 취약점"에 대한 이해와 동작원리를 살펴볼 것이고, 이에 대한 원인과 대응방안도 살펴보자.


파일 다운로드 취약점이란 무엇일까
파일명 혹은 경로 값으로 전달되는 사용자 입력 값에 경로 이동 문자 혹은 경로 변조를 통해 정상적인 파일이 아닌 비 정상적인 파일을 받는 행위이다.

여기서 정상, 비 정상 파일을 구분짓는 기준은 웹 서비스 혹은 개발자가 의도한 바운더리(Boundary) 내에 존재하는 파일을 다운 받는지 여부에 따라 결정이 된다.

2372228165_5968b40ca2493_15000340606647.
그림 1. 비 정상적인 파일 vs 정상적인 파일

어떻게 공격할 것인가?
사용자가 입력 가능한 파일명 혹은 경로 값에 "../" 혹은 "..\"를 입력 해 경로 변조 후 공격자가 의도한 파일을 받는다.
물론 파일 다운로드 기능에 따라 공격 방법은 조금씩 달라질 수는 있다. 
예를 들어, 절대 경로 전체를 입력 받는 경우도 있다. 이럴 경우 경로를 "/etc/", 파일명을 "passwd"로 변조해 다운로드가 가능하다.

2372228165_5968b40ca68d9_15000340606822.
그림 2. 공격 방법

../를 넣었을 뿐인데... 어떤 원리에서 동작하는 것일까?

최초에 공격자는 파일명에 "../../../../../etc/passwd"라는 입력 값을 넣고 요청을 한다.

2372228165_5968b40caaaf8_15000340606991.
그림 3. 공격 시도

그러면 웹 서버에서는 이를 받아서 "download.jsp"라는 어플리케이션에 요청을 전달한다.
이후 filename이란 입력 값을 기존에 선언된 업로드 경로 값과 바인딩을하고 최종 경로를 파일 입출력 관련 코드를 통해 경로에 해당하는 파일을 불러오게 된다.

2372228165_5968b40cb3604_15000340607347.
그림 4. 백 엔드 동작 원리(1)

"/webroot/upload/../../../../../etc/passwd"라는 경로로 파일을 불러오는데 이때 "../" 경로 이동 문자로 인해, "/etc/passwd" 파일을 호출하게 된다.

2372228165_5968b40cb8ee4_15000340607575.
그림 5. 백 엔드 동작 원리(2)

최종적으로 "passwd" 파일이 다운로드가 된다. 
 
2372228165_5968b40cbdf79_15000340607781.
그림 5. 백 엔드 동작 원리(3)

그렇다면... 취약점 발생 원인은 무엇일까?

사용자 입력 값에 대한 검증 부재가 원인이다. 입력 값을 받은 뒤 아무런 검증 없이 경로 바인딩을 통해 파일을 호출한다.
또한, 입력 값에 대한 검증 미흡이다. 부재와 미흡은 전혀 다른 것이다. 부재는 존재하지 않는 다는 것, 미흡은 흡족하지 못하거나 만족하지 못하다는 것이다.

2372228165_5968b40cc3385_15000340607998.
그림 6. 입력 값 검증 절차 미 존재

안전한 파일 다운로드 기능 구현을 위한 몇 마디의 조언

보안을 고려한 웹 사이트에서 설계에서 가~장 중요한 뽀인트!는 바로 "사용자 입력 값 검증을 신뢰하지 않는 것"이다.
이것은 어느 누가 반박할 수 없는 절대 진리이다. 대부분의 취약점은 사용자 입력 값에서 발생된다.

아래의 항목에 따라 대응을 하면 안전한 파일 다운로드 기능 구현이 가능하다.
- 파일명에 대한 입력 값에서 "/", "\" 문자를 "제거 혹은 에러 처리"를 한다.
- 경로 값을 사용자로부터 받을 경우, 되도록 서버의 경로를 사용자에게 노출 시키는 것은 바람직하지 못한 구현이다. 때문에 아주 일부, 1 디렉터리 정도만 입력 받는다.
그리고 그 경로 값에 대해 "/", "\" 문자를 "제거 혹은 에러 처리"를 한다.
- 보안 공통 모듈로 적용을 하는데, "/", "\"문자의 제거는 서비스 상에 문제 발생이 야기될 경우, 다른 공통 모듈을 만들거나 파일 다운로드 단일 소스코드에 적용하면 된다.

물론... 이거 외에도 다른 적용방법들은 많을 것이다. 
되도록 문자에 대한 제거/치환 보단 에러 처리를 하는 것이 보안적으로 바람직하다.

+ 해킹 비밀 노트 카페

  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오스토리로 보내기
  • 네이버밴드로 보내기

Comments