آسیب پذیری SQL Injection در پلاگین WP Statistics

آسیب پذیری SQL Injection در پلاگین WP Statistics ورژن ۱۲٫۰٫۷ و قدیمی تر که چندین روز پیش توسط شرکت امنیتی Sucuri عمومی شد و چون سایت ما هم از این پلاگین استفاده می کرد و کاربر محور است و اجازه ثبت نام به کاربر را میدهد باعث شد که به تحلیل و بررسی این باگ بپردازیم برای بهره برداری (exploit) این آسیب پذیری ، هکر نیاز دارد که ابتدا در سایت تارگت ثبت نام و یک اکانت ایجاد کند . بعد برای اجرای یک حمله sql injection  به دیتابیس نیاز به یک shortcode دارد . کمپانی معروف در زمینه امنیت وردپرس (Wordfence) به اشتباه یک همچنین پستی را در بلاگ خود منتشر کرده است :It’s been a tough week for the WP Statistics plugin. Last Friday, Sucuri (now owned by GoDaddy) discovered a SQL injection vulnerability in the WP Statistics plugin version 12.0.7 and older. To exploit the vulnerability, an attacker needs to register an account (or use a compromised account) with subscriber-level access. They can then exploit a weakness in a WP Statistics shortcode to launch a SQL injection attack. This allows them to, for example, create an admin-level user and sign in to your website as an admin. این آسیب پذیری به هیچکس اجازه ساخت یک اکانت با سطح دسترسی admin  نمیدهد که به اشتباه در وبلاگ نوشته شده “این آسیب پذیری اجازه ساخت یک اکانت با سطح دسترسی ادمین برای ورود به پنل سایت را میدهد ” که کاملا اشتباه است و بیشتر وبسایت ها خبری مبنی بر خبر بین المللی برای این آسیب پذیر منتشر کردند که جای تعجب دارد!حتما بخوانید  ثبت نام مرحله ای با phpخب این مورد زیاد پیچیده نیست بنابراین خط کد هایی که به این باگ مربوط است را برای شما آوردم :
switch ( $time ) {
case ‘today’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’ )}’ AND {$search_query}” );
break;

case ‘yesterday’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -1 )}’ AND {$search_query}” );

break;

case ‘week’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -7 )}’ AND {$search_query}” );

break;

case ‘month’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -30 )}’ AND {$search_query}” );

break;

case ‘year’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -365 )}’ AND {$search_query}” );

break;

case ‘total’:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE {$search_query}” );

break;

default:
$result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, $time)}’ AND {$search_query}” );

break;12345678910111213141516171819202122232425262728293031323334switch ( $time ) {case ‘today’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’ )}’ AND {$search_query}” ); break; case ‘yesterday’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -1 )}’ AND {$search_query}” ); break; case ‘week’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -7 )}’ AND {$search_query}” ); break; case ‘month’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -30 )}’ AND {$search_query}” ); break; case ‘year’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, -365 )}’ AND {$search_query}” ); break; case ‘total’: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE {$search_query}” ); break; default: $result = $wpdb->query( “SELECT * FROM `{$tablename}` WHERE `last_counter` = ‘{$WP_Statistics->Current_Date( ‘Y-m-d’, $time)}’ AND {$search_query}” ); break;  $search_query در دستورات مختلف sql  بدون هیچگونه پاکسازی (sanitize) استفاده شده است .

مهمترین قسمت کد دستور SELECT است که اجازه خواندن اطلاعات دیتابیس را برایمان فراهم می کند .دستورات بالا به ما اجازه اضافه کردن هیچگونه اطلاعات یا اضافه کردن کاربر با دسترسی ادمین را نمی دهد (نیاز به دستور INSERT  است) . کاری که با این باگ می توانید انجام دهید فقط خواندن اطلاعات داخل دیتابیس به صورت کند(!!) است . که بیشتر برای سایت های رو به معمول استفاده خاصی ندارد (مگر اینکه تارگت خاصی برای دامپ کردن اطلاعات کاربران داشته باشید).

حالا دوستان دیگری را من در فروم های مختلف دیدم که با این توچیه که می شود با;  یک دستور دیگر مثل insert  داخل پیلود حمله را پیش برد که باز هم اشتباه است! دلیلش هم میتوانید با بررسی متد query  و یک دستوری بودن آن پیدا کنید .

درصورتی روش بالا جوابگو هست که بتونید stacked queries هارو داشته باشید !!stacked queries چیست ؟

این قابلیت به نفوذگر اجازه به پایان رساندن دستور اصلی sql خود اسکریپت را می دهد که ممکن هست باعث اجرا شدن دستوراتی مثل delete , drop و truncate  برای پاک کردن کل اطلاعات دیتابیس بشود.
SELECT * FROM site WHERE siteid=1;

DELETE FROM site1SELECT * FROM site WHERE siteid=1;

;DELETE FROM site

ممکن است شما دوست داشته باشید
ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.