代码之家  ›  专栏  ›  技术社区  ›  PaulG

了解Wordpress漏洞

  •  14
  • PaulG  · 技术社区  · 15 年前

    This post 完全公开后,详细说明了该漏洞,并包括相关代码片段。邮报提到

    我希望有熟悉PHP的人能更详细地解释这个bug。

    受影响人士应 update 新的2.8.4版本显然修复了该缺陷。

    wp-login.php:
    ...[snip]....
    line 186:
    function reset_password($key) {
        global $wpdb;
    
        $key = preg_replace('/[^a-z0-9]/i', '', $key);
    
        if ( empty( $key ) )
            return new WP_Error('invalid_key', __('Invalid key'));
    
        $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE
    user_activation_key = %s", $key));
        if ( empty( $user ) )
            return new WP_Error('invalid_key', __('Invalid key'));
    ...[snip]....
    line 276:
    $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';
    $errors = new WP_Error();
    
    if ( isset($_GET['key']) )
        $action = 'resetpass';
    
    // validate action so as to default to the login screen
    if ( !in_array($action, array('logout', 'lostpassword', 'retrievepassword',
    'resetpass', 'rp', 'register', 'login')) && false ===
    has_filter('login_form_' . $action) )
        $action = 'login';
    ...[snip]....
    
    line 370:
    
    break;
    
    case 'resetpass' :
    case 'rp' :
        $errors = reset_password($_GET['key']);
    
        if ( ! is_wp_error($errors) ) {
            wp_redirect('wp-login.php?checkemail=newpass');
            exit();
        }
    
        wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
        exit();
    
    break;
    ...[snip ]...
    
    2 回复  |  直到 14 年前
        1
  •  17
  •   bdonlan    15 年前

    因此,$key是querystring中的一个数组,只有一个空字符串[“”]

    http://DOMAIN_NAME.TLD/wp-login.php?action=rp&key[]=

     //$key = ['']
     $key = preg_replace('/[^a-z0-9]/i', '', $key);
     //$key = [''] still
    

    因为 preg_replace

     $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users 
          WHERE user_activation_key = %s", $key));
    

    现在,从这里开始,我需要阅读wordpress源代码,了解prepare是如何工作的。。。

    更多:

    所以准备好电话 vsprintf

    $a = array('');
    $b = array($a);
    vsprintf("%s", $b);
    //Does not produce anything
    

    因此,SQL是:

    从$wpdb中选择*->用户\激活\密钥=''的用户

    哪个会 显然地 匹配管理员用户(我想还有没有激活密钥的所有用户)。

        2
  •  0
  •   Community CDub    7 年前

    how to patch this vulnerability -wp-login.php上的第190行现在应该是这样的;

    if ( empty( $key ) || is_array( $key ) )