
CVE-2023-45503 संदर्भ
Macrob7 Macs फ्रेमवर्क कंटेंट मैनेजमेंट सिस्टम (CMS) संस्करण 1.1.4f और उससे पहले के संस्करणों में, उपयोगकर्ता इनपुट के असुरक्षित हैंडलिंग के कारण 16 SQL इंजेक्शन भेद्यताएँ उत्पन्न होती हैं। मनमाना SQL क्वेरी निष्पादित करने की क्षमता के परिणामस्वरूप उपयोगकर्ताओं के पासवर्ड हैश सहित निजी डेटा लीक हो सकता है, और अन्य उपयोगकर्ताओं के क्रेडेंशियल और विशेषाधिकार स्तर को संशोधित करने की क्षमता मिल सकती है। इसके प्रभाव में विशेषाधिकार वृद्धि और संभावित रिमोट कोड एक्जीक्यूशन (RCE) शामिल हो सकता है।
प्रत्येक प्रभावित एंडपॉइंट, भेद्य पैरामीटर और भेद्य फ़ंक्शंस का विवरण देने वाली एक स्प्रेडशीट इस लिंक पर पाई जा सकती है।
CWE वर्गीकरण: CWE-89: SQL कमांड में प्रयुक्त विशेष तत्वों का अनुचित निराकरण ('SQL इंजेक्शन')
रिपोर्ट किया गया: Ally Petitt
प्रभावित उत्पाद: Macrob7 Macs CMS
प्रभावित संस्करण: 1.1.4f और पिछले
मैंने 16 उदाहरणों में देखा कि उपयोगकर्ता इनपुट को उचित स्वच्छता या पैरामीटरीकरण के बिना प्राप्त किया गया। उदाहरण के लिए, इस CMS की "पासवर्ड भूल गए" कार्यक्षमता में एक ईमेल पता माँगा जाता है।
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
इसके बाद ईमेल पते को विधि getUserByEmailAddress() में पास किया जाता है, जो ईमेल को selectSingle() पर भेजती है, एक ऐसी विधि जो इंजेक्टेड SQL क्वेरीज़ के विरुद्ध उचित रूप से सुरक्षा नहीं करती।
Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
फिर, selectSingle() पास किए गए उपयोगकर्ता इनपुट के साथ select() को कॉल करता है।
Application/core/DB.php:200
public function selectSingle($tableName, array $where = array(), array $fields = array('*'))
{
$return = $this->select($tableName, $where, $fields);
$single = NULL;
if( count($return) > 0 )
$single = $return[0];
return $single;
}
भेद्य select() फ़ंक्शन इसमें पास किए गए पैरामीटर्स को एक SQL क्वेरी में जोड़ता है, जिसे बाद में निष्पादित किया जाता है।
Application/core/DB.php:186
public function select($tableName, array $where = array(), array $fields = array('*'))
{
$fieldsString = $this->generatePair($fields, ',');
$whereString = $this->generateKeyValuePair($where, '=', 'AND');
$sql = 'SELECT '.$fieldsString.' FROM '.$tableName;
if($whereString !='')
$whereString = ' WHERE '.$whereString;
$sql = $sql.' '.$whereString.';';
return $this->execute($sql)->fetchAll($this->returnType, $this->className);
}
इनपुट स्वच्छता, सत्यापन और पैरामीटरीकरण की कमी के कारण, यह फ़ंक्शन SQL इंजेक्शन हमलों के प्रति भेद्य बना रहता है।
दुर्भाग्य से, इस CMS पर रखरखाव की कमी का मतलब है कि पैच किया गया अपडेट उपलब्ध नहीं है। व्यक्तिगत उपयोगकर्ता कोड में संशोधन कर सकते हैं ताकि उपयोगकर्ता इनपुट को डेटाबेस में पास करने के लिए कॉन्केटनेशन पर निर्भर रहने के बजाय पैरामीटरयुक्त SQL क्वेरीज़ शामिल की जाएँ। तैयार स्टेटमेंट्स (Prepared statements) एक शमन का उदाहरण हैं जो इसे प्राप्त कर सकते हैं।