
CVE-2026-36669에 대한 상세 보안 권고: Feng Office에서 인증되지 않은 임의 파일 업로드로, 저장형 XSS 및 세션 하이재킹 가능. 기술 분석, PoC 및 수정 단계 포함.
ck_upload_handler.php에 **Feng Office Community Edition (버전 3.11.13.11)**의 인증되지 않은 임의 파일 업로드 취약점이 존재합니다. 이 결함으로 인해 원격의 인증되지 않은 공격자가 웹 접근 가능 디렉터리에 임의의 파일(악성 .html 또는 .php 스크립트 포함)을 업로드할 수 있습니다. 관리자 쿠키 보호(HttpOnly) 부재와 결합하면, 이 취약점은 저장형 사이트 간 스크립팅(Stored XSS) 및 관리자 세션 탈취로 이어질 수 있습니다.
| 항목 | 세부 정보 |
|---|
| CVE 식별자 | CVE-2026-36669 |
| 취약점 유형 | 위험한 유형의 파일 무제한 업로드 (CWE-434) |
| 관련 약점 | 중요 기능에 대한 인증 누락 (CWE-306) |
| 영향받는 제품 | Feng Office Community Edition |
| 영향받는 버전 | 버전 3.11.13.11 (및 잠재적으로 이전 버전) |
| 악용 상태 | 개념 증명(PoC) 확인됨 |
| 수정 상태 | 패치되지 않음 (공급업체에 통보했으나, 표준 공개 기간 내에 패치가 제공되지 않음) |
ck_upload_handler.php 엔드포인트는 독립 스크립트로 작동합니다. 메인 애플리케이션의 인증 미들웨어나 접근 제어 목록(ACL)을 로드하거나 상속하지 않습니다. 결과적으로 이 스크립트로 직접 전송된 모든 외부 요청은 인증된 것으로 처리됩니다.
ck_upload_handler.php의 소스 코드에서 특정 이미지 형식(.jpg, .png, .gif)으로 업로드를 제한하도록 설계된 서버 측 파일 검증 로직(21-25행)이 명시적으로 주석 처리되어 있습니다:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
이 정규식 제약 조건이 비활성화되었기 때문에 파일 업로드 메커니즘은 사용자가 제공한 모든 확장자를 허용합니다.
이 스크립트는 PHP copy() 함수를 사용하여 업로드된 파일을 웹 접근 가능하도록 구성된 /tmp/ 디렉터리에 직접 씁니다.
전역 설정 파일 application/config/config.php는 세션 쿠키에 HttpOnly 플래그를 적용하지 않습니다. 공격자가 클라이언트 측 스크립트 블록이 포함된 .html 파일을 업로드하면, 해당 파일을 보는 모든 관리자는 활성 세션의 컨텍스트 내에서 스크립트를 실행하게 됩니다. 이를 통해 공격자는 활성 관리자 세션 토큰을 조용히 추출할 수 있습니다.
참고: 이 개념 증명은 교육 및 방어 감사 목적으로만 제공됩니다.
취약점을 확인하려면, 필수 CKEditorFuncNum 매개변수를 추가하여 무해한 확인 파일(예: test.html)이 포함된 multipart POST 요청을 엔드포인트로 보내십시오:
curl -i -X POST \
-F "[email protected]" \
"http://<대상-도메인>/ck_upload_handler.php?CKEditorFuncNum=1"
여기서 test.html은 기본 개념 증명 HTML 마크업을 포함합니다:
<!DOCTYPE html>
<html>
<body>
<script>
alert("취약점 확인됨: " + document.cookie);
</script>
</body>
</html>
취약한 경우, 서버는 200 OK 상태로 응답하고 업로드 경로를 나타내는 JavaScript 블록을 출력합니다:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
영향받는 버전의 Feng Office를 사용하는 경우, 파일 업로드 엔드포인트를 보호하기 위해 다음과 같은 수동 핫픽스를 적용하십시오:
ck_upload_handler.php가 파일 업로드 로직을 처리하기 전에 활성 관리자 세션을 확인하도록 하십시오.
확장자 검사를 주석 해제하고 엄격하게 적용하십시오. 예상되는 비실행 이미지 MIME 유형과 명시적으로 일치하지 않는 업로드는 거부하십시오:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
PHP 설정 또는 애플리케이션 부트스트랩 구성을 수정하여 세션 쿠키가 클라이언트 측 스크립팅 API를 통해 접근할 수 없도록 하십시오:
session.cookie_httponly = On
Soufiane LAGZIRI