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
'programing' 카테고리의 다른 글
| AngularJS - 함수를 지시어로 전달합니다. (0) | 2023.02.26 |
|---|---|
| Apache 프록시 뒤에 내장된 Tomcat을 사용한 Spring Boot (0) | 2023.02.26 |
| Json 객체 Android에서 문자열 값 가져오기 (0) | 2023.02.26 |
| 각도 Ctrl 클릭? (0) | 2023.02.26 |
| WooCommerce 3에서 주문 항목과 WC_Order_Item_Product를 가져옵니다. (0) | 2023.02.26 |