Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워크 보안

Zotabox FB 메신저 라이브 채팅 플러그인의 치명적 XSS 취약점

워드프레스 플러그인을 노린 끊임없는 공격, 이번 표적은 'FB 메신저 라이브 채팅'

전 세계 웹사이트의 상당수가 워드프레스로 운영되고 있어 해커들은 인기 있는 워드프레스 플러그인을 끊임없이 공략하고 있습니다. 그만큼 워드프레스 플러그인에서 취약점이 발견되는 일은 끝이 없어 보입니다. 이번에는 Zotabox(조타박스)가 배포하는 FB 메신저 라이브 채팅(FB Messenger Live Chat) 플러그인에서 지속형 XSS(저장형 크로스 사이트 스크립팅) 취약점이 발견되었습니다.

공식 워드프레스 플러그인 디렉터리 기준으로 이 플러그인은 활성 설치 수 3만 건을 넘어서고 있습니다. WordPress.org에 따르면 취약점이 패치된 새 버전 1.4.9가 하루 전에 배포되었습니다.

Zotabox FB 메신저 라이브 채팅 플러그인의 치명적 XSS 취약점

FB 메신저 라이브 채팅의 XSS 취약점 상세 분석

문제의 핵심은 워드프레스 AJAX 기능입니다. AJAX는 페이지를 새로 고침하지 않고도 데이터를 서버의 스크립트로 전송하고 응답을 받아올 수 있게 해 주는 기능인데, 이 경로를 통해 update_zb_fbc_code 함수가 누구에게나 열려 있었습니다.

아래 코드에서 확인할 수 있듯이 로그인 사용자용 wp_ajax_update_zb_fbc_code와 비로그인(비권한) 사용자용 wp_ajax_nopriv_update_zb_fbc_code가 모두 동일한 함수인 update_zb_fbc_code를 호출합니다. 결국 로그인 여부와 상관없이 누구나 플러그인 설정을 변경할 수 있었던 것입니다. 이 취약점이 얼마나 심각하며 다양한 방식으로 악용될 수 있는지 아무리 강조해도 지나치지 않습니다.

154 add_action("wp_ajax_update_zb_fbc_code", "update_zb_fbc_code");
155 add_action("wp_ajax_nopriv_update_zb_fbc_code", "update_zb_fbc_code");

설상가상으로 update_zb_fbc_code 함수는 설정 변경을 허용하기 전에 사용자 권한(capability) 검증은 물론 CSRF(크로스 사이트 요청 위조) 방지 검사도 수행하지 않습니다. 입력값에 대한 검증과 무결성 처리 역시 극히 제한적입니다. 유일한 필터링은 addslashes() 처리뿐인데, 수정된 설정값이 프런트 엔드 화면에 그대로 렌더링되는 구조에서는 이 정도의 필터링으로는 충분하지 않습니다.

157 function update_zb_fbc_code(){
158	header('Access-Control-Allow-Origin: *');
159   header('Access-Control-Allow-Credentials: true');
160	$domain = addslashes($_REQUEST['domain']);
161	$public_key = addslashes($_REQUEST['access']);
162	$id = intval($_REQUEST['customer']);
163	$zbEmail = addslashes($_REQUEST['email']);
164	if(!isset($domain) || empty($domain)){
165		header("Location: ".admin_url()."admin.php?page=zb_fbc");
166	}else{
167		update_option( 'ztb_domainid', $domain );
168		update_option( 'ztb_access_key', $public_key );
169		update_option( 'ztb_id', $id );
170		update_option( 'ztb_email', $zbEmail );
171		update_option( 'ztb_status_disconnect', 2 );
172		wp_send_json( array(
173			'error' => false,
174			'message' => 'Update Zotabox embedded code successful !' 
175			)
176		);
177	}
178 }

이 XSS 취약점으로 인해 이후 단계의 처리 과정들도 연쇄적으로 영향을 받습니다. 플러그인은 워드프레스 페이지가 로드될 때 실행되도록 insert_zb_fbc_code()를 등록해 둡니다.

151 add_action( 'wp_head', 'insert_zb_fbc_code' );

이렇게 저장된 값은 print_zb_fbc_code() 함수 등으로 전달되어 실제 페이지에 출력됩니다.

139 function insert_zb_fbc_code(){
140	if(!is_admin()){
141		$domain = get_option( 'ztb_domainid', '' );
142		$ztb_source = get_option('ztb_source','');
143		$ztb_status_disconnect = get_option('ztb_status_disconnect','');
144		$connected = 2;
145		if(!empty($domain) && strlen($domain) > 0 && $ztb_status_disconnect == $connected){
147			print_r(html_entity_decode(print_zb_fbc_code($domain)));
148		}
149	}
150 }
180 function print_zb_fbc_code($domainSecureID = "", $isHtml = false) {
181
182	$ds1 = substr($domainSecureID, 0, 1);
183	$ds2 = substr($domainSecureID, 1, 1);
184	$baseUrl = '//static.zotabox.com';
185	$code = <<<STRING
186 <script type="text/javascript">
187 (function(d,s,id){var z=d.createElement(s);z.type="text/javascript";z.id=id;z.async=true;z.src=" {$baseUrl}/{$ds1}/{$ds2}/{$domainSecureID}/widgets.js";var sz=d.getElementsByTagName(s)[0];sz.parentNode.insertBefore(z,sz)}(document,"script","zb-embed-code"));
188 </script>
189 STRING;
190	return $code;
191 }

안전을 위해 지금 바로 업데이트하세요

가장 확실하면서도 기본적인 안전 조치는 패치된 버전으로 업데이트하는 것입니다. FB 메신저 라이브 채팅 플러그인은 버전 1.4.9로 업데이트되었습니다. 악용 시도를 차단하려면 최대한 빨리 이 버전으로 업데이트하시기 바랍니다.

나아가 웹사이트에 강력한 입력값 검증·무결성 체계를 갖춰두면 XSS, CSRF 등의 공격을 사전에 예방할 수 있습니다.

종합 보안 솔루션의 필요성

요즘처럼 위협이 끊이지 않는 환경에서 보안을 소홀히 하면 그 대가는 상상 이상으로 클 수 있습니다. 웹사이트를 지속적으로 모니터링하는 종합적인 보안 체계를 갖추는 것이 무엇보다 중요합니다. 워드프레스에 특화된 Astra WordPress Security Suite 같은 보안 솔루션이 든든한 해결책이 될 수 있습니다. Astra는 웹 방화벽(WAF)을 제공해 XSS, CSRF, 악성 봇, SQL 인젝션(SQLi) 등 100여 가지 이상의 공격으로부터 웹사이트를 보호합니다. 지금 Astra 데모를 신청하거나 문의를 남겨주시면 기꺼이 도와드리겠습니다.