[웹 취약점 진단/모의해킹/해킹] 파일 업로드

목차

     

     

    FU - 파일 업로드

     

    ■ 점검내용

     

    웹 사이트의 게시판, 자료실 등에 조작된 Server Side Script 파일 업로드 및 실행 가능 여부 점검

     

    ■ 점검목적

     

    업로드되는 파일의 확장자에 대한 적절성 여부를 검증하는 로직을 통해 공격자가 조작된 Server Side Script 파일 업로드 방지 및 서버상에 저장된 경로를 유추하여 해당 Server Side Script 파일 실행을 불가능하게 하기 위함

     

    ■ 보안위협

     

    해당 취약점이 존재할 경우 공격자는 조작된 Server Side Script 파일을 서버에 업로드 및 실행하여 시스템 관리자 권한 획득 또는 인접 서버에 대한 침입을 시도할 수 있음

     

    ■ 참고

     

    ※ Server Side Script: 웹에서 사용되는 스크립트 언어 중 서버 측에서 실행되는 스크립트

    ※ 소스코드 및 취약점 점검 필요

     

     

    점검대상 및 판단기준

     

    ■ 대상 : 웹 애플리케이션 소스코드, 웹 서버, 웹 방화벽

     

    양호

    업로드되는 파일에 대한 확장자 검증이 이루어지는 경우

     

    취약

    업로드되는 파일에 대한 확장자 검증이 이루어지지 않는 경우

     

    ■ 조치방법

     

    업로드되는 파일에 대한 확장자 검증 및 실행 권한 제거

     

     

    점검 및 조치 방법

     

    ■ 점검방법

     

    Step 1) 웹 사이트에 파일 업로드 기능이 존재하는 경우, 확장자가 jsp, php, asp, cgi 등 Server Side Script 파일들이 업로드 가능한지 확인

    ※ 클라이언트에서 JavaScript, VBScript 등의 스크립트로 파일 첨부를 차단하는 경우 차단 기능을 수정하여 파일 첨부함

     

    Step 2) 웹 사이트에 있는 디렉터리 정보를 이용하여 첨부한 Server Side Script 파일의 위치를 조사한 후 브라우저 주소창에 해당 경로를 입력하여 실행 가능한지 확인

     

    ■ 보안설정방법


    ※ 사용자가 파일을 업로드할 수 있는 모든 모듈에 적용 필요
    * 화이트 리스트 방식으로 허용된 확장자만 업로드 가능토록 서버 측 통제 적용
    * 업로드되는 파일을 디렉터리에 저장할 때 파일명과 확장자를 외부 사용자가 추측할 수 없는 문자열로 변경하여 저장(파일 이름은 DB에 저장)

    * 업로드 파일을 위한 전용 디렉터리를 별도로 생성하여 웹 서버 데몬 설정 파일(httpd.conf 등)에서 실행 설정을 제거함으로써, Server Side Script가 업로드되더라도 웹 엔진이 실행하지 않는 환경을 설정함
    * 파일 업로드 필드를 대상으로 특수문자 필터링하도록 웹 방화벽 룰셋 적용


    ※ 유형 별 상세 설정


    ⚫ 웹 애플리케이션


    ∎ ASP

     

    Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
    • 이미지 파일의 경우 (JPG, GIF, BMP 등)
    • 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)
    (예) doc, hwp, pdf, jpg 파일만 업로드 허용 (※ 예로 제시하는 것으로, 구현 시 다를 수 있음)
    확장자 검증 시 대소문자 구분 없이 문자열 비교

    ....
    FunctionIsAllowExtension(originFilename,mAllowExtension)
    Dim ReturnValue, eregObj, matches, PatternStr, FileNameExt
    FileNameExt = Mid(originFilename, InStrRev(originFilename, “.”) +1)
    ReturnValue = False
    if IsNull(mAllowExtention) Then
    IsAllowExtension = True
    Exit Function
    End if
    PatternStr = “^(“ & Replace(mAllowExtention, “,”,”|”) & “)$”
    Set eregObj = New RegExp
    With eregObj
    .IgnoreCase = True
    .Global = True
    .Pattern = PatternStr
    ReturnValue = .test(FileNameExt)
    End with
    Set eregObj = Nothing
    IsAllowExtention = ReturnValue
    End Function
    .....
    If Not IsAllowExtention(“파일명.txt”, “doc,hwp,pdf,jpg”) Then
    response.write “허용되지 않은 확장자 입니다.”
    End if

     

    Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단
    (예) MIME TYPE을 통한 악성 파일 업로드 차단

    if UploadForm("UPFILE").MineType<> "image" then
    Response.write "Permit only Image files"
    Response.end
    end if

     

    ∎ ASP.net

     

    Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
    • 이미지 파일의 경우 (JPG, GIF, BMP 등)

    • 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)
    (예) doc, hwp, pdf, jpg 파일만 업로드 허용 (※ 예로 제시하는 것으로, 구현 시 다를 수 있음)
    확장자 검증 시 대소문자 구분 없이 문자열 비교

    string upload_Image(FileUpload fileupload, string ImageSavedPath)
    {
    FileUpload fu = fileupload;
    string imagepath = "";
    if (fileupload.HasFile)
    {
    string filepath = Server.MapPath(ImageSavedPath);
    String fileExtension = System.IO.Path.GetExtension(fu.FileName).ToLower();
    String[] allowedExtensions = { ".doc", ".hwp", ".pdf", ".jpg" };
    for (int i = 0; i < allowedExtensions.Length; i++)
    {
    if (fileExtension == allowedExtensions[i])
    {
    try
    {
    string s_newfilename = DateTime.Now.Year.ToString()+
    DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString()+
    DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString()+
    DateTime.Now.Second.ToString() + fileExtension;
    fu.PostedFile.SaveAs(filepath + s_newfilename);
    imagepath = ImageSavedPath + s_newfilename;
    }
    catch (Exception ex)
    {
    Response.Write("File could not be uploaded.");
    }
    }
    }
    }
    return imagepath;
    }

     

    Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단
    (예) MIME TYPE을 통한 악성 파일 업로드 차단

    public void validateFileToUpload(FileUpload objFile)
    {
    intMAX_FILE_SIZE=(4*1024*1024);
    int fileSize = objFile.PostedFile.ContentLength;
    if(fileSize>MAX_FILE_SIZE)
    {
    returnMessage="FileUploadFailed";
    returnreturnMessage;
    }
    string chosenFileExtension = System.IO.Path.GetExtension(objFile.FileName);
    string[]allowedExtensions= {".doc",".xls",".ppt",".pptx",".txt" };
    if(!allowedExtensions.Contains(chosenFileExtension))
    {
    returnMessage="FileUploadFailed";
    returnreturnMessage;
    }
    string[] allowedMimeTypes = { "text/plain", "text/xml" };
    stringchosenFileMiMeType=objFile.PostedFile.ContentType;
    if(!allowedMimeTypes.Contains(chosenFileMiMeType))
    {
    returnMessage="FileUploadFailed";
    returnreturnMessage;
    }
    }

     

    ∎ JSP

     

    Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
    • 이미지 파일의 경우 (JPG, GIF, BMP 등)
    • 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)
    (예) doc, hwp, pdf, jpg 파일만 업로드 허용 (※ 예로 제시하는 것으로, 구현 시 다를 수 있음)
    확장자 검증 시 대소문자 구분 없이 문자열 비교

    .....
    publievoidupload(HttpServletRequestrequest)throwsServletException
    {
    MultipartHttpRequest multi = (MultipartHttpRequest) request;
    String next = (String) multi.getFileNames().next();
    MultipartFile file = multi.getFile(next);
    If (file == null ) return;
    // 화이트 리스트 방식으로 업로드 파일 확장자 체크
    if (fileName != null)
    {
    If (fileName,endsWith(“.doc”) || fileName,endsWith(“.hwp”) ||
    fileName,endsWith(“.pdf”) || fileName,endsWith(“.jpg”))
    {
    //file 업로드 루틴: 저장 시 파일명을 외부 사용자가 추측할 수 없는 형태로 변경
    .....

     

    Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단
    (예) MIME TYPE을 통한 악성 파일 업로드 차단

    <%
    String[] validExt = {"jpg","gif","png" }; // 파일 허용 확장자
    String[] validType = {"application/octet-stream",
    "application/x-msdownload",
    "application/x-sh" }; // 파일 MIME 타입 제한
    MultipartRequest mRequest = new MultipartRequest(request,
    SITE_UPLOAD_DIR+strUploadDir, intUploadMaxSize,
    "UTF-8", new DefaultFileRenamePolicy());
    uploadFileSystemName1 = mRequest.getFilesystemName("attach1");
    //저장파일명
    File strGetfile1= mRequest.getFile("attach1");
    uploadFileExt1 =
    uploadFileSystemName1.substring(uploadFileSystemName1.lastIndexOf('.')
    + 1); // 파일 확장자
    uploadFileType1 = mRequest.getContentType("attach1"); //파일 MIME 타입
    for(int i=0; i< validType.length; i++) {
    if(uploadFileType1.equalsIgnoreCase(validType[i])) {
    out.print("<script>alert('업로드 금지 파일')</script>");
    commUtil.deleteFile(SITE_UPLOAD_DIR+strUploadDir+"/", uploadFileSystemName1);
    return;
    }
    }
    %>

     

    ∎ PHP

     

    Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
    • 이미지 파일의 경우 (JPG, GIF, BMP 등)
    • 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)
    (예) doc, hwp, pdf, jpg 파일만 업로드 허용 (※ 예로 제시하는 것으로, 구현 시 다를 수 있음)
    확장자 검증 시 대소문자 구분 없이 문자열 비교

    .....
    // 파일 이름에 특수문자가 있을 경우 업로드를 금지시킴
    if (eregi("[^a-z0-9 \._ \-]",$_FILES['userfile']['name']))
    print "파일 이름의 특수문자 체크";
    exit;
    // 파일 확장자 중 업로드를 허용할 확장자를 정의함
    $full_filename = explode(".", $_FILES['userfile']['name']);
    $extension = $full_filename[sizeof($full_filename)-1];
    $extension= strtolower($extension);
    if (!( ereg($extension","hwp") || ereg($extension","pdf") || ereg($extension","jpg")) )
    print "업로드 금지 파일 입니다";
    exit;
    .....

     

    Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단
    (예) MIME TYPE을 통한 악성 파일 업로드 차단

    <?
    // 허용된 확장자를 가진 파일에 대해서 파일 업로드 성공
    If (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") ||
    ($_FILES["file"]["type"] == "image/JPG") || ($_FILES["file"]["type"] == "text/plain"))
    {
    echo "파일 업로드 성공"
    }
    else
    {
    echo "파일 업로드 실패. 허용된 파일의 형식이 아닙니다."
    }
    ?>

     

    ⚫ 웹 서버


    ∎ IIS


    설정 > 제어판 > 관리도구 > 인터넷 서비스(IIS) 관리자 선택
    해당 업로드 폴더에서 우클릭 > 등록 정보 > 디렉터리> 실행 권한 “없음” 설정

     

    ∎ Apache

     

    Apache 설정 파일인 httpd.conf에 해당 디렉터리에 대한 문서 타입을 컨트롤 하기 위해 Directory 섹션의 AllowOverride 지시자에서 FileInfo 또는, “All” 추가

    <Directory “/usr/local/apache”>AllowOverride FileInfo (또는, All)….

    <Directory>

    파일 업로드 디렉터리에 .htaccess 파일을 만들고 다음과 같이 AddType 지시자를 이용, 현재 서버에서 운영되는 Server Side Script 확장자를 text/html로 MIME Type을 재조정하여 업로드된 Server Side Script가 실행되지 않도록 설정
    또는, FileMatch 지시자를 이용하여 *.ph, *.inc, *lib 등의 Server Side Script 파일에 대해서 직접 URL 호출을 금지시킴

    <.htaccess><FilesMatch “ \.(ph|inc|lib)”>
    Order allow, deny
    Deny from all
    </FilesMatch>
    AddType text/html .html .htm .php .php3 .php4 .phtml .phps .in .cgi .pl .shtml .jsp

    ※ 주의할 점
    • Apache 서버의 경우 AllowOverride 지시자 변경 시 Apache Restart 필요

    • 파일 업로드 되는 디렉터리에 운영에 필요한 Server Side Script가 존재하는지 확인
    • 파일 다운로드 프로그램이 아닌 직접 URL 호출을 통해 파일을 다운받는 경우 FileMatch 지시자를 사용하면 차단 설정한 확장자의 파일 다운로드는 거부됨


    * 첨부 파일 확장자 필터링 처리로 사용자가 첨부 파일의 업로드 시도 시, 업로드 파일의 확장자를 검토하여 적절한 파일인지 검사하는 루틴을 삽입하여, 적합한 파일의 확장자 이외의 파일에 대해서 업로드가 불가능하도록 하며, 이런 필터링 규칙은 서버에서 구현하여야 함
    * 시스템 보안 설정 시 웹 서버 구동은 반드시 관리자 권한이 아닌 일반 사용자 권한으로 구동함
    * 외부 사용자가 첨부 파일을 이용하여 권한을 획득할지라도 최소한의 권한만을 사용할 수 있도록 함
    * 업로드된 디렉터리에서 실행 권한을 제거하는 방법은 임시적이기는 하지만 소스 코드의 수정 없이 간단히 수행될 수 있음


    ⚫ 웹 방화벽
    * 웹쉘에 주로 사용되는 문자열, 오브젝트, 메소드 등을 시그니처로 지정하여 파일 업로드 시 탐지 및 차단함

     

     

    조치 시 영향 : 일반적인 경우 영향 없음

     

    댓글

    Designed by JB FACTORY