본문 바로가기
Security Project

44. 파일 업로드 취약점 대응 (시큐어코딩, 보안설정, 웹쉘차단 솔루션)

by 귀멸 2023. 1. 23.

1. 시큐어 코딩 - 소스코드 레벨 대응

첨부 파일 확장자 검증은 서버 사이드 스크립트에서 검증해야 함

첨부파일 확장자 검증은 "블랙리스트 차단" → "화이트 리스트 허용"으로 해야 함

 

// 블랙리스트
function file_upload_check_1($file, $file_extentions = 
array("asp", "aspx". "dll", "exe", "jsp", "php"), $directory = "images")

 

//화이트리스트
function file_upload_check_2($file, $file_extensions = 
array("jpeg", "jpg", "png", "gif"), $directory = "images")

 

<?php
	$tmp_name = $_FILES['Filedata']['tmp_name'];
    $filename = $_FILES['Filedata']['name'];
    $filename_ext = strtolower(array_pop(explode('.',$filename)));
    // 업로드하는 파일의 이름을 소문자로 바꾸고 . 뒤의 문자열을 추출
    $allow_ext = array("jpg", "png", "hwp", "pptx", "docx", "xlsx", "pdf");
	// 추출한 문자열이 화이트 리스트와 비교하여 해당하지 않으면 아래 구문 실행
    if(!in_array($filename_ext, $allow_ext)) {
    		echo "허용되지 않는 확장자 파일 입니다.";
            exit;
    }
    // 파일 이름의 예: " ../upload/20191110083.hwp"
    // 파일 이름을 특정한 방식으로 바꾸어서 저장한다.
    $newPath = '../upload/'.date('YmdHis').mt_rand().'.'.$filename_ext;
    @move_uploaded_file($tmp_name, $newPath);

 

2. 시스템 보안 설정

Apache 설정 파일인 httpd.conf에 업로드되는 파일을 저장하는 디렉터리에 대한

문서 타입을 컨트롤하기 위해  Directory 섹션의 AllowOverride 지시자에서 FileInfo 또는 All 추가

AccessFileName .htaccess
<Directory "/var/www/htdocs/upload/">
AllowOverride FileInfo
</Directory>

파일 업로드 디렉토리에 .htaccess 파일 만들고

AddType 지시자를 이용해서 Server Side Script가 실행되지 않도록 설정

#.htaccess 파일 내용
<.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

 

파일 업로드되는 디렉토리를 웹서버와 분리된 서버에 저장하고 해당 서버의 실행 권한을 완전히 죽여 놓는다. 

(비용 문제 발생)

 

3.  웹쉘차단 솔루션 활용 

  • PHPDETECT
    데이터베이스에서 가지고 있는 웹쉘 파일 해시값을 통해 스크리닝
     소스코드 내 문자열 스크리닝

  • NeoPI
    악성코드 여부 판단 (일치계수, 긴 문자열, 엔트로피 수치) 
    악성코드일 확률을 점수화한다.

    IC(Index of Coincidence)
    문장에 사용하는 텍스트 비율을 통계를 통해 암호화 여부를 확인한다.
    정상적인 텍스트 비율이 아닌 많은 특수문자나 비정상적인 텍스트가 사용되었는지

    Entropy
    엔트로피는 어떠한 데이터를 표현하기 위한 평균 정보량을 의미.
    데이터가 많을수록 엔트로피가 높은 파일이고, 암호화된 텍스트가 많으면 파일의 엔트로피가 높아짐.

    LongestWord
    가장 긴 문자열을 식별하여 웹쉘을 찾아내는 방식
  • php-malware-finder
    악성코드에서 자주 사용되는 패턴을 찾아 특정 수 이상이 발견될 시 의심 (Yara Rule)
    Base64, Hex와 같은 인코딩 방식을 인식하여 관련 파일을 해독/분석 후에 탐지 범위를 넓힘
    화이트리스트 방식을 채택하여 검증함으로 오탐을 줄임

  • webshell-scanner-client
    golang으로 만들어진 오픈소스 솔루션
    바이두에서 제공하는 서비스로 현재 무료 API를 제공

댓글