خرید بک لینک
همانطور که قبلا هم اشاره شد این آسیب پذیری از WordPress REST API تاثیر گرفته است که به صورت پیشفرض بروی وردپرس نسخه ی 4.7.0 و 4.7.1 اضافه و فعال است در نتیجه اگر شما وردپرس خود را بروز نکرده اید شما به این آسیب پذیری دچار هسنید. یکی از این API ها اجازه نمایش، ویرایش، ایجاد و پاک کردن پست را فراهم میکرده است که اگر از این آسیب پذیری استفاده کنید هر کسی میتواند صفحات و پست های سایت های وردپرسی را تغییر دهد.

تحلیل آسیب پذیری:
همه چیز از فایل زیر شروع شده است.

کد PHP:


./wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php



register_rest_route
$this->namespace'/' $this->rest_base '/(?P<id>[d]+)', array(
            array(
                
'methods'             => WP_REST_Server::READABLE,
                
'callback'            => array( $this'get_items' ),
                
'permission_callback' => array( $this'get_items_permissions_check' ),
                
'args'                => array(
                    
'context'  => $this->get_context_param( array( 'default' => 'view' ) ),
                    
'password' => array(
                        
'description'  => __'The password for the post if it is password protected.' ),
                        
'type'        => 'string'
                    ),
                ),
            ),            
            array(
                
'methods'             => WP_REST_Server::EDITABLE,
                
'callback'            => array( $this'update_items' ),
                
'permission_callback' => array( $this'update_items_permissions_check' ),
                
'args'                  => $this->get_endpoint_args_for_iteam_schemaWP_REST_Server::EDITABLE ),
            ),
            array(
                
'methods'             => WP_REST_Server::DELETABLE,
                
'callback'            => array( $this'delete_items' ),
                
'permission_callback' => array( $this'delete_items_permissions_check' ),
                
'args'                  => array(
                    
'force' => array(
                        
'type'            => 'boolean',
                        
'default'        => false,
                        
'description'    => __'Whether to bypass trash and force deletation.' ),
                    ),
                ),
            ),
            
'schema' => array( $this'get_public_iteam_schema' ),
         ) ); 


چند چیز باید به اطلاع برسانم، روتین ثبت نام طوری طراحی شده که پارامترهای ورودی به صورت شماره درخواست میشوند به عنوان مثال این درخواست در نظر بگیرید

کد PHP:

/wp-json/wp/v2/posts/1234 


ارامتر ID با شماره 1234 تنظیم شده است.این راه به تنهای راه خوبی برای جلوگیری از ورودی های مخرب است اما زمانی که درخواست به صورت REST API فرستاده شود ما میتوانیم با استفاده از عبارات منظم درخواست خود را به این صورت ارسال کنیم :
کد PHP:

/wp-json/wp/v2/posts/1234?id=12345helloworld 


در این ارسال این مقدار "12345helloworld" به پارامتر ID ارسال میشود که علاوه بر عدد در درخواست ما حروف هم ارسال شده است..

ما نگاهی به Callback ها مختلفی کردیم اما یکی از آنها توجه ما را به خودش جلب کرد! update_item که سطح دسترسی را با متد update_item_permissions_check چک میکند :
کد PHP:

public function update_iteam_permission_check$request ) {

    
$post get_post$request['id'] );
    
$post_type get_post_type_object$this->post_type );
    
    if ( 
$post && ! $this->check_update_permission$post ) ) {
        return new 
WP_Error'rest_caot_edit'__'Sorry, you are not allowed to edit this post.' ), array( 'status' => rest_authorization_required_code() ) );
    }
    
    if ( ! empty( 
$request['author'] ) && get_current_user_id() !== $request['author'] && ! current_user_can$post_type->cap->edit_others_posts ) ) {
        return new 
WP_Error'rest_caot_edit_others'__'Sorry, you are allowed to update posts as this user.' ), array( 'status' => rest_authorization_required_code() ) );
    }
    
    if ( ! empty( 
$request['sticky'] ) && get_current_user_can$post_type->cap->edit_others_posts ) ){
        return new 
WP_Error'rest_caot_assign_sticky'__'Sorry, you are allowed to make post sticky.' ), array( 'status' => rest_authorization_required_code() ) );
    }
    
    if ( ! 
$check_assign_terms_permission$request ) ) {
        return new 
WP_Error'rest_caot_assign_term'__'Sorry, you are allowed to assign the provided terms.' ), array( 'status' => rest_authorization_required_code() ) );
    }
    
    return 
true;


خلاصه، ورودی ما که یه عبارت منظم شامل عدد و حروف است به صورت مستقیم به تابع get_post() ارسال میشود که این تابع درخواست ارسال شده را با در نظر گرفتن اینکه این پست قبل وجود داره و آیا کاربر مذکور اجاره ویرایش پست را دارد چک میکند، اما اگر پارامتر ID ما به پستی ارسال شود که اصلا وجود ندارد، ما روال چک کردن دسترسی را پاس میکنیم و به درخواست ما اجازه میدهد که این روال درخواست را به قسمت update_item ادامه دهد.

با توجه به کد زیر باز ما میتوانیم با ارسال یک غیر عددی این چک را شکست بدیم و در نهایت وردپرس به ما این امکان را میدهد که این شرط ها را پاس کنیم و به تابع update_item برسیم،چون فکر میکند کاربر این مجوز دارد.
کد PHP:

public static function get_instance$post_id ) {
    
golbal $wpdb;
    
    if ( ! 
is_numeric$post_id ) || $post_id != floor$post_id ) || ! $post_id ) {
    return 
false;
    
    } 

خب قسمتی که آسیب پذیری را تکمیل میکند مربوط به تابع update_iteam میشود چرا که با استفاده از خط زیر است که درخواست ما را به integer کست میکند و سپس به تابع get_post ارسال میکند
کد PHP:

public function update_iteam$request ) {
    
$id = (int) $request['id'];
    
$post get_post$id ); 

در آخر این ویژگی PHP است که اگر مقدار متغیر ID شامل "123AVC" باشد آنرا به 123 کست میکند.

منبع :

کد PHP:

http://badware.ir/Blog/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%A2%D8%B3%DB%8C%D8%A8-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-content-injection-vulnerability-in-wordpress/ 

موفق باشید

برچسب: نویسنده: محمد رضا جوادیان تاريخ: پنجشنبه 5 مرداد 1396 ساعت: 20:02

صفحه بندی