细说CVE-2024-10924
字数 1091 2025-08-22 12:22:24
CVE-2024-10924漏洞分析与利用教学文档
漏洞概述
CVE-2024-10924是WordPress插件Really Simple SSL中的一个认证绕过漏洞,影响版本9.0.0及以下。该漏洞存在于双因素认证(2FA)的电子邮件验证流程中,允许攻击者在知道有效用户ID的情况下绕过2FA保护。
漏洞成因
漏洞位于security/wordpress/two-fa/class-rsssl-two-factor-on-board-api.php文件的validate_email_setup方法中。
关键问题点:
check_login_and_get_user方法验证失败后没有终止执行流程- 验证失败后仍然使用原始的用户ID参数继续执行
- 没有正确检查
check_login_and_get_user方法的返回值
漏洞代码分析
问题函数
public function validate_email_setup(WP_REST_Request $request ): WP_REST_Response {
$parameters = new Rsssl_Request_Parameters( $request );
$user = $this->check_login_and_get_user( $parameters->user_id, $parameters->login_nonce );
// Check if the provider.
if ( 'email' !== $parameters->provider ) {
return new WP_REST_Response( array( 'error' => 'Invalid provider' ), 401 );
}
if ( !Rsssl_Two_Factor_Email::get_instance()->validate_token( $parameters->user_id, self::sanitize_token($parameters->token) ) ) {
// we reset all the settings.
Rsssl_Two_Factor_Email::set_user_status( $parameters->user_id, 'open' );
Rsssl_Two_Factor_Totp::set_user_status( $parameters->user_id, 'open' );
// we logout the user
wp_logout();
return new WP_REST_Response( array( 'error'Code was was invalid, try "Resend Code"', 'really-simple.ssl-pro') ), 401 );
}
Rsssl_Two_Factor_Email::set_user_status( $parameters->user_id, 'active' );
// Mark all other statuses as inactive.
self::set_other_providers_inactive( $parameters->user_id, 'email' );
return $this->authenticate_and_redirect( $parameters->user_id, $parameters->redirect_to );
}
验证函数
private function check_login_and_get_user( int $user_id, string $login_nonce ) {
if ( ! Rsssl_Two_Fa_Authentication::verify_login_nonce( $user_id, $login_nonce ) ) {
return new WP_REST_Response( array( 'error' => 'Invalid login nonce' ), 403 );
}
/**
* Get the user by the user ID.
*
* @var WP_User $user
*/
$user = get_user_by( 'id', $user_id );
return $user;
}
漏洞利用条件
- 目标网站使用Really Simple SSL插件9.0.0或更早版本
- 网站启用了电子邮件作为2FA验证方式
- 攻击者知道有效的用户ID
漏洞利用步骤
1. 生成token
通过调用以下路由之一生成token:
save_default_method_emailsave_default_method_email_profile
这些路由会调用start_email_validation方法,进而调用generate_token方法生成8位数字token。
2. 暴力破解token
token生成方式:
public function generate_token( int $user_id ): string {
$token = self::get_code(); // 生成8位数字
update_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY_TIMESTAMP, time() );
update_user_meta( $user_id, self::RSSSL_TOKEN_META_KEY, wp_hash( $token ) );
return $token;
}
wp_hash函数使用MD5加盐算法,盐值来自wp-config.php中的NONCE_SALT等定义。
3. 验证token
调用validate_email_setup路由提交猜测的token。如果token正确,将绕过2FA验证。
利用限制
-
时间限制:token有效期为15分钟
public function user_token_ttl( int $user_id ): int { $token_ttl = 15 * MINUTE_IN_SECONDS; return (int) apply_filters( 'rsssl_two_factor_token_ttl', $token_ttl, $user_id ); } -
破解难度:
- 需要暴力破解8位数字token
- 如果无法获取wp-config.php中的salt值,需要尝试约1亿种可能
- 如果能够获取wp-config.php,可以在本地高效计算hash
修复建议
- 立即升级Really Simple SSL插件到最新版本
- 官方修复方法:在验证失败后正确终止执行流程
总结
CVE-2024-10924是一个典型的认证逻辑缺陷漏洞,由于验证失败后没有正确终止执行流程,导致可以绕过2FA保护。虽然利用有一定限制(需要知道用户ID和暴力破解token),但仍是一个严重的安全问题。开发者应引以为戒,在编写认证代码时确保验证失败后立即终止后续流程。