작업 환경
- VMware Workstation Pro (17.6.2 ver)
- Server
- Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
- DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
- Client
- Kali Linux : Web 취약점 점검용 (VMnet 1)
- GNS 구성
- 해당 점검은 웹하드 페이지에 한해서 진행됨
FU (상) | 22. 파일 업로드 |
취약점 개요 | |
점검 내용 | 웹 사이트의 게시판, 자료실 등에 조작된 Server Side Script 파일 업로드 및 실행 가능 여부 점검 |
점검 목적 | 업로드되는 파일의 확장자에 대한 적절성 여부를 검증하는 로직을 통해 공격자가 조작된 Server Side Script 파일 업로드 방지 및 서버상에 저장된 경로를 유추하여 해당 Server Side Script 파일 실행을 불가능하게 하기 위함 |
보안 위협 | 해당 취약점이 존재할 경우 공격자는 조작된 Server Side Script 파일을 서버에 업로드 및 실행하여 시스템 관리자 권한 획득 또는 인접 서버에 대한 침입을 시도할 수 있음 |
판단 기준 |
양호 : 업로드되는 파일에 대한 확장자 검증이 이루어지는 경우 취약 : 업로드되는 파일에 대한 확장자 검증이 이루어지지 않는 경우 |
참고 | OWASP TOP 10 항목 중 A01 : Broken Access Control A04 : Insecure Design A05 : Security Misconfiguration 에 해당한다고 판단 |
점검 방법
- Step 1) 웹 사이트에 파일 업로드 기능이 존재하는 경우, 확장자가 jsp, php, asp, cgi 등 Server Side Script 파일들이 업로드 가능한지 확인
- Step 2) 웹 사이트에 있는 디렉터리 정보를 이용하여 첨부한 Server Side Script 파일의 위치를 조사한 후 브라우저 주소창에 해당 경로를 입력하여 실행 가능한지 확인
- Step 3) 페이지의 모든 기능을 수집하여 프로세스 상에 통제된 페이지 접근이 가능한지 확인
보안 설정 방법
※ 사용자가 파일을 업로드할 수 있는 모든 모듈에 적용 필요
- 화이트 리스트 방식으로 허용된 확장자만 업로드 가능토록 서버 측 통제 적용
- 업로드되는 파일을 디렉터리에 저장할 때 파일명과 확장자를 외부 사용자가 추측할 수 없는 문자열로 변경하여 저장(파일 이름은 DB에 저장)
- 업로드 파일을 위한 전용 디렉터리를 별도로 생성하여 웹 서버 데몬 설정 파일(httpd.conf 등)에서 실행 설정을 제거함으로써, Server Side Script가 업로드되더라도 웹 엔진이 실행하지 않는 환경을 설정함
- 파일 업로드 필드를 대상으로 특수문자 필터링하도록 웹 방화벽 룰셋 적용
PHP
- Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
- 이미지 파일의 경우 (JPG, GIF, BMP 등)
- 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)
설정 1) .doc, .hwp, .pdf, .jpg 파일만 업로드할 수 있게 설정
/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정
$allowed_ext = ['doc', 'hwp', 'pdf', 'jpg'];
$ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed_ext)) {
echo "<script>alert('허용되지 않은 파일 확장자입니다.'); history.back();</script>";
exit;
}
→ 1차 보안 완성
설정 2) 업로드된 파일 이름을 랜덤으로 바꿔서 저장
/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정
$server_name = uniqid('file_', true) . '.' . $ext;
→ index.php 같은 파일을 올리고 웹에서 실행하는 것 방지
설정 3) .htaccess로 업로드 되었더라도 실행 자체를 차단
/var/www/html/uploads/.htaccess
php_flag engine off
RemoveHandler .php .phtml
→ .php , .phtml 형식의 파일은 실행 불가 (텍스트로만 보임)
테스트
- 설정 1) 을 적용
- index.php 파일 업로드
<? php
HELLO
?>
허용되지 않은 확장자 .php 를 업로드 하여 파일 업로드 실패
만약 확장자를 위조한다면?
- 설정1, 2) 를 적용
- index.php 를 index.php.pdf 로 위장하여 파일을 업로드한다면 업로드가 될까?
<? php
HELLO
?>
위 결과로부터 MIME TYPE 확인이 필요한 이유를 알 수 있음
설정2) 의 설정에 의해 파일명이 변경되지만, 업로드 폴더로 접근이 가능할 시 파일명은 바꿀 수 있음
만약 설정3) 이 적용 되어있다면 파일은 업로드 되어도, 실행 권한은 없으므로 방어 가능
- Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단 로직 추가
/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정
// MIME 타입 허용 리스트
$allowed_mime = [
'application/msword',
'application/pdf',
'image/jpeg',
'application/x-hwp',
'application/octet-stream' // 일부 .hwp 용도
];
// 확장자 검사
$ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed_ext)) {
echo "<script>alert('허용되지 않은 확장자입니다.'); history.back();</script>";
exit;
}
// MIME 타입 검사
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $tmp);
finfo_close($finfo);
if (!in_array($mime, $allowed_mime)) {
echo "<script>alert('MIME 타입이 일치하지 않습니다.'); history.back();</script>";
exit;
}
테스트
- 위에서 테스트한 동일한 파일(index.php.pdf) 업로드
<? php
HELLO
?>
Header 부분이 PDF 형식과 달라 필터링된 모습
참고
📌 MIME 타입이란 ?
파일의 “실제 내용”이 어떤 종류인지 설명하는 표준 식별자
- MIME : Multipurpose Internet Mail Extensions
- 파일의 헤더를 기준으로 판단
MIME 정리
파일 이름 | 확장자 | MIME 타입 |
report.pdf | application/pdf | |
photo.jpg | .jpg | image/jpeg |
resume.hwp | .hwp | application/x-hwp |
script.php | .php | application/x-httpd-php 또는 text/plain |
virus.exe | .exe | application/x-msdownload |
왜 중요한가?
사용자가 확장자를 위장할 수 있음
nice_picture.jpg.exe
evil.php.txt
OS나 브라우저는 가장 마지막 . 뒤의 문자열만 확장자로 인식하여 확장자를 속일 수 있음
→ 공격자가 업로드 디렉터리에서 .php로 리네임하거나 .htaccess 우회로 실행 시도 가능하여 취약점 존재
파일명 | 인식되는 확장자 |
evil.php.txt | .txt |
invoice.pdf.exe | .exe |
cat.jpg | .jpg |
→ 파일 내용을 직접 읽어서 판단하는 MIME 타입 검사가 필요
→ PHP에서 finfo_file( ) 로 검사하는 MIME 타입은 파일의 시작 바이트(Header) 를 기준으로 판단
→ PDF 파일은 %PDF- 로시작, JPG 는 ÿØÿà 로 시작
→ 파일 내용도 PDF 헤더와 비슷하게 조작된 경우 MIME 타입 검사도 우회할 수 있음
∴ .htaccess 파일에서 확장자에 따른 실행 권한을 차단 (총 3단계 방어)
/var/www/html/uploads/.htaccess
php_flag engine off
RemoveHandler .php .phtml
🔐 OWASP TOP 10(2021)과의 연관
OWASP Top 10 공식 문서 일부
A01:2021 – Broken Access Control
"Uploaded files represent a significant risk to applications. The first step in many attacks is to get some code to the system to be attacked. Then the attack only needs to find a way to get the code executed."
A04:2021 – Insecure Design
"Insecure design is a broad category representing different weaknesses, expressed as ‘missing or ineffective control design.’ It is different from insecure implementation. One is a design flaw, the other is a failure to implement the design. There is a need for more threat modeling, secure design patterns and principles, and reference architectures."
A05:2021 - Security Misconfiguration
"Security misconfiguration is the most commonly seen issue. This is commonly a result of insecure default configurations, incomplete or ad hoc configurations, open cloud storage, misconfigured HTTP headers, and verbose error messages containing sensitive information. Not only must all operating systems, frameworks, libraries, and applications be securely configured, but they must be patched and upgraded in a timely fashion."
1. A01 : Broken Access Control
- 파일 업로드 기능에서 사용자 인증 없이 접근이 가능하거나, 업로드된 파일에 대한 접근 제어가 부족한 경우
- 즉, 권한이 없는 사용자가 시스템 자원에 접근하거나 조작
2. A04 : Insecure Design
- 파일 업로드 기능에서 확장자나 MIME 타입 검증이 부족하여, 악성 파일이 업로드될 수 있는 구조적인 문제
3. A05 : Security Misconfiguration
- 업로드 디렉토리에 .htaccess 파일이 없거나, 실행 권한이 제대로 설정되지 않아 악성 스크립트가 실행될 수 있는 경우
'주요정보통신기반시설가이드 > Web 취약점 점검' 카테고리의 다른 글
[PV (상)] 21. 프로세스 검증 누락 (0) | 2025.05.14 |
---|---|
[AU (상)] 20. 자동화 공격 (2) | 2025.05.14 |
[SF (상)] 19. 세션 고정 (0) | 2025.05.14 |
[SC (상)] 18. 불충분한 세션 만료 (0) | 2025.05.14 |
[IN (상)] 17. 불충분한 인가 (0) | 2025.05.13 |