워드프레스의 권한 처리 메커니즘은 주로 역할별로 다른 기능을 제공하여 구현됩니다. 스토어 관리자 역할이 정의되면 이 역할에 edit_users 기능을 할당하여 고객 계정을 직접 관리할 수 있습니다. . 전체 권한 할당 프로세스는 플러그인 설치 프로세스 중에 발생합니다. woocommerce/includes/class-wc-install.php:
//Shop manager role.add_role( 'shop_manager', // Internal name of the new role 'Shop manager', // The label for displaying array( // Capabilities ⋮ 'read_private_posts' => true, 'edit_users' => true, 'edit_posts' => true, ⋮ ));
역할 권한 정보는 WordPress 핵심 설정과 함께 데이터베이스에 저장됩니다. 즉, 플러그인이 활성화되지 않은 경우에도 사용자 역할은 이제 플러그인과 독립적입니다. , 관련 역할 권한에는 영향을 미치지 않습니다.
인증된 사용자가 다른 사용자 정보를 수정하려고 하면 current_user_can() 함수가 호출되어 권한이 있는 사용자만 이 작업을 수행할 수 있도록 합니다. Current_user_can() 함수 호출 예:
$target_user_id= $_GET['target_user_id'];if(current_user_can('edit_user',$target_user_id)) { edit_user($target_user_id);}
호출의 확인 논리는 다음과 같습니다. 이 사용자는 $target_user_id ID를 사용하여 특정 사용자를 수정하려고 합니다.
기본 구성에서 edit_users 기능을 사용하면 권한이 있는 사용자(예: 매장 관리자)가 다른 사용자, 심지어 관리자 사용자를 편집한 다음 비밀번호 업데이트와 같은 작업을 수행할 수 있습니다. 보안상의 이유로 WooCommerce는 상점 관리자가 사용자를 편집할 수 있는지 여부를 지정해야 하므로 플러그인은 메타 권한을 추가해야 합니다. 메타 함수는 current_user_can()에 의해 호출될 수 있습니다. 기본 동작에서 함수가 반환하는 값은 true이지만, 메타 권한 함수가 반환하는 값은 현재 사용자가 그러한 작업을 수행할 수 있는지 여부를 결정할 수 있습니다. 다음은 WooCommerce 메타 권한 필터의 추상 함수 코드입니다.
function disallow_editing_of_admins( $capability, $target_user_id ) { // If the user is an admin return false anddisallow the action if($capability == "edit_user"&& user_is_admin($target_user_id)) { return false; } else { return true; }}add_filter('map_meta_cap', 'disallow_editing_of_admins');
예를 들어 current_user_can('edit_user', 1)이 호출되면 필터는 ID 1($target_user_id)을 가진 사용자가 다음인지 여부를 결정합니다. 관리자가 결정합니다. 사용자가 결과에 따라 작업을 수행하도록 허용할지 여부입니다.
기본적으로 관리자만 플러그인을 비활성화할 수 있습니다. 그러나 이 취약점으로 인해 상점 관리자는 서버에서 쓰기 가능한 모든 파일을 삭제할 수 있으므로 WooCommerce의 기본 파일인 woocommerce.php를 삭제하여 WordPress에서 플러그인을 로드하는 것을 방지할 수 있습니다.
이 파일 삭제 취약점은 WooCommerce의 로깅 기능에 존재합니다. 로그는 .log 파일 형식으로 wp-content 디렉터리에 저장됩니다. 매장 관리자가 로그 파일을 삭제하려면 파일 이름을 GET 매개변수로 제출해야 합니다. 아래 표시된 코드 조각은 취약한 부분입니다:
class WC_Admin_Status{ public static function remove_log() { ⋮ $log_handler = newWC_Log_Handler_File(); $log_handler->remove(wp_unslash($_REQUEST['handle']));}
class WC_Log_Handler_File extends WC_Log_Handler{ public function remove($handle) { ⋮ $file = trailingslashit(WC_LOG_DIR) .$handle; ⋮unlink($file);
여기서 문제는 파일 이름($handle)이 로그 디렉터리(wp-content/wc-logs/)에 추가된 다음 unlink() 함수에 전달된다는 것입니다. "$handle../../plugins/woocommerce-3.4.5/woocommerce.php"를 설정할 때 wp-content/wc-logs/../../plugins/woocommerce-3.4.5/woocommerce.php 파일을 작성하세요. 제거되고 WooCommerce가 비활성화됩니다.
위 내용은 WordPress 플러그인 WooCommerce의 임의 파일 삭제 취약점을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!