티스토리 뷰

반응형



웹해킹 중 간단하지만 발생했을 때 매우 위험한 취약점 중 하나로 업로드 취약점이 있습니다. 사실상 웹쉘이 업로드만 된다면 서버가 탈취된 것과 동일하기 때문이죠. 다행스럽게도 웹쉘 업로드를 방지하는 방법은 매우 간단합니다.


웹쉘 업로드를 방지하기 위해서는 서버에 업로드를 허용할 확장자를 선정한 뒤 업로드 하려는 파일의 확장자를 대/소문자 구분없이 검증해야 합니다. 여기에 Null Injection 등을 통해 확장자 검증을 우회할 수 있기 때문에 전달받은 파일명에 공백과 널 바이트를 삭제해줘야 합니다.


이밖에도 업로드 취약점과 관련하여 추가로 확인해야 하는 내용들이 아래와 같습니다.


01. 상대경로/절대경로 포함 여부

02. 업로드 허용 경로검증

03. 응답값 내 파일명 및 파일경로 노출 여부

04. 데이터 저장을 위한 파일 업로드 후 파일 삭제

05. 압축파일 업로드 시 압축해제 후 파일 검증

06. 스테가노 그라피 공격


이 밖에도 다양한 케이스는 존재합니다만, 작성한 내용에 대해서만 이야기 해보도록 하겠습니다.




01. 상대경로/절대경로 포함여부


업로드를 할 때 파일명 또는 파일경로에 상대경로 또는 절대경로를 나타낼 수 있는지 여부를 검증해야 합니다. 허용하는 확장자의 파일이라 하더라도 기존에 존재하는 파일을 덮어씌워 정상적인 서비스를 방해할 수도 있기 때문이죠. 게다가 업로드하려는 파일을 웹서버에서 접근이 불가능한 곳에 저장한 경우, 다른 취약점 우회를 통해 웹쉘을 업로드 할 수 있을 경우, 절대경로/상대경로를 통해 웹쉘을 웹서버에서 접근이 가능한 곳에 저장할 수 있게 되므로 반드시 경로를 나타낼 수 있는 특수기호의 포함여부를 함께 검증해줘야 합니다.




02. 업로드 허용 경로검증


파일을 업로드할 때 개발 디자인에 따라 가끔 경로정보를 파라미터로 전달하는 경우가 있습니다. 가장 좋은 방법은 허용할 경로정보를 인덱스로 지정하여 사용하는 것이지만, 만약 한정지을 수 없는 경우 어쩔 수 없이 경로정보를 전달해야 할 것입니다. 이때는 임시 파일객체에 경로와 파일명을 전달하여 절대경로를 가져와 해당 경로에 대한 권한이 있는지 여부를 서버측 코드에서 검증해줘야 합니다. 하지만 이 방법은 완전히 모든 문제를 해결하기는 어렵기 때문에 되도록이면 경로정보를 입력값으로 전달하지 않는 것이 좋을 것 같습니다.




03. 응답값 내 파일명 및 파일경로 노출 여부


파일을 업로드 후 해당 파일을 웹서버에 저장할 때 전달받은 파일명이 아닌 유추가 불가능한 랜덤한 값을 사용한 파일명으로 웹서버에 저장해줘야 합니다. 향후 업로드한 파일을 다운로드해야 한다면, 데이터베이스에 전달받은 입력값을 별도로 저장하여 관리해주면 됩니다. 


ex. 랜덤 파일명

String fileName = Session.getAttribute("LOGIN_ID") + "_"+UUID.randomUUID().toString() + date.getTime()


또한 업로드한 파일은 웹서버를 통해 실행되지 않도록 웹서버의 상위 경로 또는 별도 파일서버에 저장시켜야 하는데, 이때 파일명 및 파일경로가 응답값에 노출될 경우, 불필요하게 정보가 제공될 수 있습니다. 만약 상대경로와 파일명을 검증하지 않게 되면, 이런 정보를 활용하여 웹서버에서 실행가능한 경로에 웹쉘을 업로드 후 실행까지 가능하게 됩니다.




04. 데이터 저장을 위한 파일 업로드 후 파일 삭제


특히 관리자 서비스를 제공할 때 엑셀 등을 통해 데이터를 서버에 저장하는 경우가 있습니다. 그리고 파일 데이터를 저장한 뒤에 파일을 삭제하는데, 파일삭제 로직을 Try문 안에만 존재할 경우 이를 이용해 웹쉘 업로드가 가능하게 됩니다. 파일을 저장 및 데이터를 읽어오는 과정에서 일부러 Exception이 발생하도록 유도하여 웹쉘이 웹서버에 저장 후 삭제되지 않도록 유도할 수 있게 되는 것이죠. 때문에, 파일생성 및 파일처리를 하는 모든 과정에 Try~Catch 구문을 설정해 놓고 Finally 구문에서 업로드한 파일이 존재할 경우 무조건 삭제하도록 로직을 구현해야 합니다.


ex. 올바른 Finally 구문

File file = null;

try{ ... }

catch(Exception e){ ... }

finally {

   if ( file != null && file.exists() ) { 

     file.delete() 

   } 

}




05. 압축파일 업로드 시 압축해제  후 파일 검증


컨텐츠를 관리하는 사이트를 구현할 경우, 매우 많은 파일을 한꺼번에 업로드하기 어려워 압축파일로 업로드를 하도록 구현하는 경우가 있습니다. 이런경우, 업로드하는 파일이 압축파일인지 여부만 검증하는 경우가 많습니다.

하지만, 이런 경우 웹쉘파일을 포함한 압축파일을 업로드하게 되는 경우, 압축을 해제 후 웹쉘이 저장되기 때문에 압축해제를 하는 로직에서는 압축해제 한 파일이 업로드를 허용할 파일인지 여부를 검증해줘야 합니다. 당연하겠지만 파일 검증할 경우, 파일의 확장자가 업로드를 허용하는 확장자인지 여부를 대/소문자 구분없이 비교해야 합니다.




06. 스테가노 그라피 공격 


보통 업로드를 허용하는 확장자로 업로드 파일을 검증하고 있다고 해도 웹쉘 업로드가 불가능한 것은 아닙니다. 바로 스테가노 그라피 공격 때문입니다. 스테가노 그라피는 이미지 파일안에 웹쉘 소스코드를 삽입하여, 이미지 파일 호출로 웹쉘이 실행되는 문제점입니다. 이는 업로드되는 파일의 실행권한이 잘못 설정된 경우 문제가 발생되는 취약점인데요, 이를 방지하기 위해 업로드하려는 파일은 웹서버 이외의 실행권한을 삭제하고 파일을 저장하도록 서버구성 및 업로드 로직을 구성해줘야 합니다. 


ex. 업로드 로직

String uploadPath = "/upload/";

String uploadFileName = getRandomFileName();

multipart.transferTo( new File( uploadPath + uploadFileName) );




업로드는 공격이 간단하지만 한번 웹쉘 업로드가 성공할 경우 매우 치명적입니다. 앞서 설명한 취약점 이외에도 다양한 시나리오의 공격이 존재할 수 있습니다. 때문에 업로드 취약점을 분석할 때는 단순히 확장자를 검증하는지 여부만 확인하지 않고 업로드를 처리하는 모든 기능에서 프로세스 상 문제가 없을지 꼼꼼히 체크해봐야 합니다.





Fin





반응형

'Web Analytics > Vulnerabilities' 카테고리의 다른 글

인증실패 횟수 관련 분석  (0) 2019.04.14
Password 관련 취약점 분석  (0) 2019.03.09
Download 취약점 분석  (0) 2019.03.06
SQL Injection 취약점 분석  (0) 2019.03.03
XSS(Cross Site Script) 취약점 분석  (0) 2019.03.01
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday