
# Snow Monkey Forms <= 12.0.3 - 인증되지 않은 경로 탐색을 통한 임의 파일 삭제 (CVE-2026-1056)
이 저장소는 Snow Monkey Forms WordPress 플러그인(버전 <= 12.0.3)의 치명적인 취약점에 대한 PoC(Proof of Concept)를 포함합니다. 이 취약점은 인증되지 않은 공격자가 경로 탐색(Path Traversal)을 통해 서버의 임의 파일을 삭제할 수 있게 합니다.
참고: Sarawut Poolkhet (MisterHelloz)
Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php/wp-json/snow-monkey-form/v1/view)취약점은 Snow_Monkey\Plugin\Forms\App\Rest\Route\View.php에 위치한 REST API 핸들러에 존재합니다. 메서드는 사용자 입력 매개변수에 따라 흐름을 결정합니다.
send()// File: App/Rest/Route/View.php
public function send() {
Csrf::save_token();
$method = Meta::get_method(); // Sourced from $_POST['snow-monkey-forms-meta']['method']
// VULNERABILITY: If 'method' is 'input', the critical CSRF check is BYPASSED.
if ( 'input' === $method ) {
return $this->_send(); // Direct execution flow to _send()
}
// CSRF check is only performed for other methods (e.g., 'confirm', 'complete')
if ( ! Csrf::validate( Meta::get_token() ) ) { ... }
공격자는 메서드 매개변수로 input을 제공하여 애플리케이션이 _send() 함수를 즉시 실행하도록 강제하고, 무단 작업을 방지하기 위한 Csrf::validate() 보안 제어를 건너뜁니다.
_send() 메서드 내부에서 애플리케이션은 사용자별 임시 디렉터리에 대한 정리 루틴을 수행하려고 시도합니다. 이 루틴은 formid 매개변수에 의존합니다.
// File: App/Rest/Route/View.php -> _send()
// 'form_id' is sourced directly from POST data via Meta class without sanitization
$user_dirpath = Directory::generate_user_dirpath( $this->setting->get( 'form_id' ), false );
Directory::do_empty( $user_dirpath, true ); // Recursively delete contents
Directory::remove( $user_dirpath ); // Delete the directory itself
핵심 결함은 Directory::generate_user_dirpath가 경로를 구성하는 방식에 있습니다:
// File: App/Model/Directory.php
public static function generate_user_dirpath( $form_id, $do_create_directory = true ) {
$saved_token = Csrf::saved_token();
// ... (Regex check for token exists, but not for form_id) ...
$user_dir = path_join( static::get(), $saved_token );
// VULNERABILITY: $form_id is appended directly.
// WordPress path_join() does NOT resolve or sanitize '../' sequences.
$user_dir = path_join( $user_dir, (string) $form_id );
return $user_dir;
}
$form_id 변수는 문자열로 캐스팅되지만 정수인지 검증되지 않습니다. 이로 인해 공격자가 디렉터리 탐색 문자(예: ../../../../)를 주입할 수 있습니다.
requests 라이브러리 (pip install requests)python exploit.py -u <TARGET_URL> -f <TRAVERSAL_PAYLOAD>
