Security2013. 12. 20. 00:12
반응형

  웹 서버를 통한 파일 업로드 기능을 구현할 일이 있어서 보안 취약점 관련해서 정리해 보았습니다. 


1. Document Root이하에서 직접 접근할 수 있는 경로로 업로드 되지 않도록 구현하기.

 가장 중요한 사항이라고 할 수 있겠습니다. 웹 서버에서 직접 접속할 수 있는 경로에 파일을 업로드 시킬 경우에 실제 링크로 공개하지 않더라도 추측에 의해서 접근할 수 있으므로 주의를 기울여야 합니다.


※웹 개발에 있어 가장 명심해야 할 점은 Document Root이하의 경로는 명시적 링크가 없더라도 접근 가능하므로 업로드 된 시점부터는 공개된 리소스 취급을 해야한다는 점입니다.

※업로드된 파일의 다운로드는 구현된 어플리케이션을 통해 충분한 접근제어가 이루어질 수 있도록 합시다.


2. 의미없는(실행 불가능한) 확장자를 부여(혹은 삭제 혹은 제한)할 필요가 있습니다.

 위1번에서 말한 취약점 혹은 다른 취약점이 존재할 경우 실행가능한 확장자로 올리는 것은 매우 취약합니다. 예를 들어 파일을 삭제하는 기능이 담긴 웹 어플리케이션(ASP,JSP,PHP)을 업로드 후 접근하여 실행한다면 바로 서비스가 중단될 수 있습니다. 따라서 취약점이 존재하더라도 확장자만 바꾸어 주어도 어느정도 방어가 가능합니다.

※다운로드 하는 클라이언트에게 영향을 미칠수 있으므로 실행가능한 파일, 스크립트 파일등은 가능한한 제한하는 편이 좋습니다.

※허용가능한 확장자라 하더라도 특수한 의미의 파일 [예)robots.txt, crossdomain.xml 등]은 제한하는 편이 좋을 수 있습니다.

※업로드할 확장자 필터링은 블랙리스트 보단 화이트리스트 방식으로 제어하는 것이 보다 안전합니다.


3. 업로더가 제공한 파일명을 그대로 사용하지 않기

 클라이언트가 업로드시 파일의 메타정보로 함께 보내온 파일명, 사이즈 등등 그대로 활용할 경우 업로드 경로에 따라 덮어 써져 버릴 가능성이 존재합니다. 그로인해 실제로 열람이 불가능한 유저의 파일이 다운로드 가능한 상태로 되버릴 수 있습니다.

※중복되지 않을만한 충분히 랜덤한 파일명으로 치환하고 클라이언트가 제공한 파일명은 별도로 보관하는 것이 좋습니다.


4. 파일 사이즈 체크

 업로드 되는 파일 사이즈는 실제 서비스에 필요한 용량을 잘 예측해서 제한해야 합니다. 무제한으로 한다던지 예측후 서버의 저장장치 용량을 가용할 정도로 배정하지 않음으로 인하여 저장장치가 가득차서 서버가 뻗을수도 있습니다.

※임시 업로드를 통한 업로드 방식의 구현의 경우 임시 파일만 잘 삭제해 줘도 되겠지요


5. 인가된 사용자에게만 업로드 허용

 익명의 파일 업로드를 허용했을 경우엔 의도적으로 대량의 파일 업로드를 발생시켜 서비스를 무력화 시키는 공격도 대비해야 할지 모릅니다.


6. 한번에 올릴 수 있는 파일 수 제한

 한번에 다수의 파일을 올릴수 있는 경우 대량의 파일 전송에 의한 특정 디렉토리의 파일 과다 저장으로 인해 파일 시스템 자체가 매우 느려지는 경우가 있을수 있으므로 수를 제한하거나 충분히 분산할 수 있는 구현을 택하도록 해야 합니다.


7. 퍼미션 제한

 퍼미션을 제어할 수 있다면 실행 퍼미션을 제거 한다든지 하는것도 좋겠습니다만 어플리케이션상에서 제어에는 한계가 있는 경우도 있도 복사나 이동시마다 다시 체크가 필요하므로 자동적인 제어가 가능할 경우에는 하는것도 좋지만 너무 집착할 필요는 없겠습니다.


8. 바이러스 스캔

 가능하다면 주기적으로 업로드된 파일을 대상으로 바이러스 검사를 하는 것도 나쁘지 않겠습니다. 취약점을 잘 제거해서 서버상에서 실행되지 않아서 서버의 피해가 없는 경우라해도 다운받는 사람에게 영향을 미칠수 있으므로 검토하는 것이 좋겠습니다.

9. 실체 확인

 예를들어 이미지 파일이 맞는지 검증등 가능한 범위내에서 드러난 확장자외에 파일의 실체를 검증하는 것도 좋겠습니다.


10.헤더 지정

'Content-disposition: attachment'헤더를 지정하여 브라우저로 하여금 실행외에 파일 저장이 실행되도록 유도할 수 있습니다.

'Content-type'을 제대로 지정함으로서 다운로드후 의도하지 않는 연결프로그램이 실행되는 것을 방지 할수 있습니다.


이상 파일 업로드 취약점에 관하여 알아보았습니다. 최소한 위의 내용중 1, 2, 3번은 지켜야 안전한 사이트를 만들 수 있을 것같습니다.


※위의 내용은 개인적으로 찾아본 내용을 정리한 것입니다. 위의 내용만으로 안전을 '보증'할 수 없습니다. 또한 잘못 기술된 내용이 있을 수 있으므로 취사선택은 각자의 영역에 맞기도록 하겠습니다.



'Security' 카테고리의 다른 글

robots.txt와 보안  (0) 2015.03.18
보안에 대한 생각 - 파일 해시 검증하기  (0) 2015.03.04
CSRF(cross site request forgery)  (3) 2014.07.14
Session Fixation 취약점  (2) 2014.07.02
윈도우 Self-Signed SSL증명서 생성  (0) 2013.12.03
Posted by Reiphiel