
CVE-2025-22352의 PoC
WordPress 플러그인
Component name ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributes
Vulnerable version <= 1.4.8
Component slug elex-bulk-edit-products-prices-attributes-for-woocommerce-basic
Component link https://wordpress.org/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/
Vulnerability class A3: Injection
Vulnerability type SQL Injection (Blind SQL Injection)
Shop Manager OR Administrator
ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributes 플러그인은 제품 일괄 편집을 지원하는 플러그인입니다.
이 플러그인에서 제품을 일괄 편집할 때 필터링을 통해 대상을 선택하며, 이 과정에서 제품 필터링 요청 시 전송되는 일부 데이터가 SQL 쿼리에 직접 삽입되면서 SQL Injection 취약점이 발생합니다.
단, SQL 쿼리 결과를 직접 확인할 수 없으며, 쿼리 결과의 참/거짓 여부를 판단하여 데이터를 추출하는 Blind SQL Injection 방식으로 취약점이 존재합니다.
위 PoC 설명에서 요청한 함수('Preview Filtered Products')를 실행하면 다음과 같은 패킷이 생성됩니다.

해당 패킷이 요청되면 /wp-content/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/includes/elex-ajax-apifunctions.php 파일의 elex_bep_filter_products 함수가 호출됩니다.
요청 데이터에서 SQL Injection 페이로드가 포함된 desired_price 값은 다음 순서를 통해 SQL 쿼리로 실행됩니다.
SQL Injection 페이로드가 포함된 desired_price 값이 직접 쿼리 조건 절에 전달되어 $price_query 변수에 할당됩니다.
product_title_text,range도 쿼리에 직접 전달되지만, PoC에서desired_price에 SQL Injection 페이로드를 전달했으므로 여기서는desired_price만 설명합니다.
// elex-ajax-apifunctions.php at line 1280
$price_query = " AND meta_key='_regular_price' AND meta_value {$filter_range} {$data_to_filter['desired_price']} ";

이후 변수 $price_query는 변수 $sql에 추가되고(1365행, #1), 변수 $sql과 문자열 AND 및 변수 $product_type_condition이 변수 를 초기화합니다(1379행, #2).

따라서 SQL Injection 페이로드가 포함된 요청 매개변수 desired_price는 $wpdb->prepare( '%1s', $main_query ) 구문의 $main_query에 포함됩니다. 이때 %1s 형식 지정자는 $main_query 값을 그대로 전달하므로, 이스케이프 없이 SQL Injection 페이로드가 쿼리에 삽입되어 SQL Injection 취약점이 발생합니다.
⚠️ PoC 코드는 제품 관리자 계정을 사용하여 Blind SQL Injection 취약점을 악용해 데이터베이스 이름을 얻기 위해 구현되었습니다.

다음으로 아래 명령을 입력하여 PoC 코드를 실행합니다.
필수 모듈requests
python poc.py

$main_query변수
$sql은elex-ajax-apifunctions.php의 1257행에서 초기화됩니다.

마지막으로 변수 $main_query는 아래와 같이 prepare 함수에 인수로 전달되어 데이터베이스 쿼리를 실행합니다.