
WordPress PPOM for WooCommerce 플러그인 <= 33.0.15는 SQL Injection에 취약합니다.
이 저장소에는 "PPOM for WooCommerce" WordPress 플러그인의 33.0.15 이하 버전에 영향을 미치는 인증되지 않은 시간 기반 블라인드 SQL 인젝션 취약점에 대한 개념 증명(PoC)이 포함되어 있습니다.
이 취약점은 플러그인이 SQL 쿼리에서 사용자 입력을 사용하기 전에 제대로 삭제하지 않기 때문에 발생합니다. 특히, classes/plugin.class.php 파일의 get_product_meta() 함수는 준비된 문(prepared statements)을 사용하지 않고 $meta_id 매개변수를 SQL 쿼리에 직접 연결합니다.
취약한 코드 (classes/plugin.class.php):
function get_product_meta( $meta_id ) {
// ...
global $wpdb;
$qry = 'SELECT * FROM ' . $wpdb->prefix . PPOM_TABLE_META . " WHERE productmeta_id = $meta_id";
$res = $wpdb->get_row( $qry );
return $res;
}
인증되지 않은 공격자는 악의적인 페이로드를 제작하여 장바구니에 제품을 추가할 때 ppom[fields][id] 매개변수에 주입함으로써 이 취약점을 악용할 수 있습니다. 이를 통해 공격자는 지연 함수(SLEEP())와 같은 임의의 SQL 명령을 실행할 수 있으며, 취약점을 확인하고 데이터베이스에서 민감한 정보를 문자 단위로 유출할 수 있습니다.
이 취약점은 플러그인 설정에서 "Enable Legacy Price Calculations" 옵션이 활성화되어 있을 때 트리거됩니다. 이 옵션은 장바구니 작업 중에 애플리케이션이 취약한 코드 경로를 사용하도록 강제하기 때문입니다.
└── cve-2025-11391/
├── exploit.py # The Python Proof of Concept script.
└── woocommerce-product-addon/ # Vulnerable version of the plugin (v33.0.15).
requests 라이브러리가 설치된 Python 3.x (pip install requests)./htdocs/wp4hacking/)에 설치합니다.woocommerce-product-addon (v33.0.15)을 woocommerce-product-addon/ 디렉토리에서 .zip 파일을 업로드하여 설치합니다.sql_injection)을 지정합니다.제공된 exploit.py 스크립트는 SLEEP() 명령을 주입하고 서버의 응답 시간을 측정하여 취약점을 확인합니다.
exploit.py 파일을 열고 다음 변수를 구성합니다.
PRODUCT_URL: 생성한 취약한 제품 페이지의 전체 URL.add_to_cart_data['add-to-cart']: 취약한 제품의 ID.터미널에서 스크립트를 실행합니다:
python exploit.py
대상이 취약한 경우 서버가 SLEEP() 시간보다 오래 응답하여 스크립트가 시간 초과됩니다. 스크립트는 이 시간 초과를 성공적인 익스플로잇으로 올바르게 해석합니다.
Attempting SQL Injection PoC (One-Step Method)...
Make sure 'Enable Legacy Price Calculations' is active.
[*] Sending SQL Injection payload...
Request timed out after 10.00 seconds.
[+] SUCCESS! 'Read timed out' occurred because the SLEEP(7) payload was executed.
The site is vulnerable to Time-Based Blind SQL Injection.
$wpdb->prepare()를 사용하여 입력을 적절히 삭제하므로 SQL 인젝션을 방지합니다.패치된 코드 (classes/plugin.class.php):
$table = $wpdb->prefix . PPOM_TABLE_META;
$res = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE productmeta_id = %d", $meta_id ) );
이 PoC는 교육 및 연구 목적으로만 제공됩니다. 소유하지 않았거나 테스트에 대한 명시적 허가를 받지 않은 시스템에서는 사용하지 마십시오. 작성자는 이 스크립트로 인한 오용 또는 손해에 대해 책임을 지지 않습니다.