programing

Wordpress 취약성 이해

iphone6s 2023. 2. 26. 09:18
반응형

Wordpress 취약성 이해

최근 WordPress 2.8.3에 영향을 미치고 암호를 변경하여 관리자가 계정에서 잠길 수 있는 취약성이 발견되었습니다.

전체 공개에 대한 이 게시물은 결함을 자세히 설명하고 관련 코드 스니펫을 포함합니다. 게시물에는 '비밀번호 리셋 기능을 악용하여 첫 번째 단계를 생략하고 $key 변수에 배열을 전송하여 관리자 비밀번호를 리셋할있습니다'라고 기재되어 있습니다.

PHP에 정통한 분이 버그를 좀 더 자세히 설명해 주셨으면 합니다.

영향을 받는 사용자는 이 결함을 수정하는 새로운 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 ]...

따라서 $key는 단일 빈 문자열이 포함된 쿼리 문자열의 배열입니다. ['']

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

reset_password가 배열과 함께 호출되고 preg_replace가 호출됩니다.

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

preg_replace는 문자열 또는 문자열 배열을 받아들이기 때문입니다.regex는 아무것도 대체하지 않고 동일한 어레이를 반환합니다.$key는 비어 있지 않기 때문에(빈 문자열의 배열입니다), 다음과 같이 됩니다.

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

자, 여기서부터 어떻게 준비하는지 워드프레스 소스를 읽어봐야겠어요

상세:

따라서 빈 문자열을 생성하는 vsprintf 콜을 준비합니다.

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

SQL은 다음과 같습니다.

선택 * FROM $wpdb -> 사용자 WHERE user_activation_key = "

admin 사용자(및 activation_keys가 없는 모든 사용자)와 일치합니다.

그렇게 해서.

취약성에 대한 패치 적용 방법에 관한 질문이 있습니다.wp-login의 line 190 입니다.php는 다음과 같이 표시됩니다.

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

언급URL : https://stackoverflow.com/questions/1267998/understanding-the-wordpress-vulnerability

반응형