
CVE-2025-22710의 PoC
WordPress 플러그인
구성 요소 이름 WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
취약한 버전 <= 8.50.0
구성 요소 슬러그 smart-manager-for-wp-e-commerce
구성 요소 링크 https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
취약점 클래스 A3: Injection
취약점 유형 SQL Injection
관리자
WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager(이하 Smart Manager) 플러그인은 WordPress에서 모든 게시물 유형을 일괄 편집하고 조회할 수 있도록 하는 플러그인입니다.
Smart Manager 플러그인 버전 8.50.0 이하에서는 게시물 조회를 위한 고급 검색 기능을 사용할 때 필터링 값이 이스케이프 처리 없이 데이터베이스 쿼리에 전달되어 SQL Injection 취약점이 발생합니다.
다만 SQL Injection 공격의 직접적인 결과는 화면에서 확인할 수 없지만, true/false 조건에 따른 응답 값의 차이를 통해 블라인드 SQL Injection이 가능합니다.
⚠️ true/false 조건에 따른 응답 값의 차이를 확인하려면 게시물이 최소 1개 이상 존재해야 합니다.
/wp-admin/admin.php?page=smart-manager)로 이동합니다.

' OR 1=1 )) #를 입력합니다. 그런 다음 상단의 검색 버튼을 클릭합니다.

' OR 1=2 )) #를 입력하면 조건이 항상 거짓(OR 1=2)이므로 검색되는 게시물이 없습니다.

위 PoC 설명에서 요청한 'Advanced Search' 기능을 실행하면 다음 패킷이 생성되며, 고급 검색에 입력된 필터링 값(Post Title, is, ' OR 1=1 )) #)이 요청 데이터 advanced_search_query에 입력됩니다.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

이 패킷이 요청되면 /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php 파일의 get_data_model 함수가 호출되어 다음 순서로 데이터베이스 쿼리를 수행합니다.
요청 데이터 advanced_search_query가 존재하면 process_search_cond 함수를 호출합니다. 이때 요청 데이터 advanced_search_query는 키-값 쌍 인수의 키 search_query 값으로 전달됩니다.
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

호출된 process_search_cond 함수는 키 search_query의 값을 반복하면서 필터링 값 Post Title(post_tile)을 변수 $search_col에 초기화하고, SQL Injection 페이로드가 포함된 필터링 값 ' OR 1=1 )) #을 변수 $search_value에 초기화합니다.
고급 검색 기능에서는 사용자 입력(' OR 1=1 )) #)이 이스케이프 처리 없이 데이터베이스 쿼리에 직접 포함되어 SQL Injection 취약점이 발생합니다. 이 취약점으로 인해 공격자는 임의의 SQL 쿼리를 실행할 수 있으며, 데이터베이스의 민감한 정보 유출이나 변조와 같은 심각한 보안 위험을 초래할 수 있습니다.
⚠️ PoC 코드 구현은 SQL Injection 취약점을 악용하여 데이터베이스 이름을 조회합니다.
편집기에서 PoC 코드를 열고 WordPress 사이트 주소와 관리자 자격 증명을 입력합니다.

그런 다음 다음 명령어를 입력하여 PoC 코드를 실행합니다.
필요한 모듈requests
python poc.py


변수 $search_col과 $search_value는 각각 $search_params 배열의 키 search_col(=post_title)과 search_value(=' OR 1=1 )) #)에 전달됩니다. 이후 이 $search_params 변수는 create_flat_table_search_query 함수에 키 search_params의 값으로 전달됩니다.

이후 create_flat_table_search_query 함수는 SQL 쿼리의 WHERE 절을 정의하며, 이때 인수로 전달된 키 search_params의 search_value(=' OR 1=1 )) #)는 이스케이프 처리 없이 WHERE 절에 포함됩니다.

그런 다음 create_flat_table_search_query 함수의 반환 값(SQL Injection 페이로드 포함)이 process_flat_table_search_query 함수의 인수로 전달됩니다.

process_flat_table_search_query 함수는 수신한 인수를 사용하여 데이터베이스 쿼리를 구성하며, 변수 $select, $from, $where를 초기화합니다. 여기서 SQL Injection 페이로드가 검증 없이 변수 $where에 직접 전달되는 것을 확인할 수 있습니다.

변수 $select, $from, $where는 변수 $query_posts_search에 직접 할당되며, 이 변수는 최종적으로 데이터베이스 쿼리를 수행하는 함수에 인수로 전달됩니다.
