
🔐 CVE-2026-57821 - Apache Fineract SQL 인젝션 툴킷 📚 승인된 보안 테스트를 위한 두 개의 Python 스크립트: verifier.py(안전한 탐지, 추출 없음) 및 exploit.py(심층 분석). 11가지 DB 유형을 지원합니다. SQL 인젝션 취약점을 이해하는 데 완벽합니다. 합법적인 테스트만 ⚠️ 교육 및 연구 목적으로만 사용하세요.

법적 및 윤리적 고지
이 툴킷은 교육, 훈련 및 승인된 보안 테스트 목적으로만 제공됩니다.
명시적인 서면 허가 없이 모든 시스템에 대해 무단으로 사용하는 것은 불법이며 컴퓨터 범죄법을 위반합니다.
작성자는 오용이나 손해에 대해 어떠한 책임도 지지 않습니다.
귀하의 행동에 대한 책임은 전적으로 귀하에게 있습니다.
CVE-2026-57821은 Apache Fineract의 사무소 목록 API 엔드포인트에서 발견된 SQL 인젝션 취약점입니다.
| 속성 | 세부 정보 |
|---|---|
| 엔드포인트 | /api/v1/offices |
| 매개변수 | orderBy |
| 메서드 | GET |
| 인증 필요 여부 | 예 (인증된 사용자만) |
| 영향받는 버전 | Apache Fineract ≤ 1.14.0 |
| 패치된 버전 | Apache Fineract 1.15.0 |
이 취약점은 orderBy 매개변수가 적절한 정제 없이 SQL 쿼리에 직접 삽입되기 때문에 존재합니다. 유효한 자격 증명을 가진 공격자는 괄호 ()로 감싼 서브쿼리를 orderBy 매개변수에 주입할 수 있습니다.
이것이 이전 수정 사항을 우회하는 이유:
ORDER BY 절을 정제하기 위해 ColumnValidator를 도입했습니다ORDER BY 컨텍스트 내에서 임의의 SQL 실행이 가능해집니다공격 벡터 예시:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
| 영향 | 설명 |
|---|---|
| 데이터 유출 | 시간 기반 블라인드 SQL 인젝션으로 민감한 데이터베이스 내용을 추출할 수 있음 |
| 서비스 거부 | 과도한 쿼리로 연결 풀 리소스가 고갈될 수 있음 |
| 정보 노출 | 오류 기반 기법으로 데이터베이스 구조와 데이터를 노출할 수 있음 |
| 속성 | 세부 정보 |
|---|---|
| 발견자 / 보고자 | Terence Monteiro (Apache Fineract 팀) |
| 공개 날짜 | 2026년 7월 14일 |
| 패치된 버전 | Apache Fineract 1.15.0 |
| 공식 발표 | Apache 메일링 리스트 |
| GitHub 수정 | PR #6048 |
이 툴킷은 11개의 서로 다른 데이터베이스 백엔드에 대해 익스플로잇 기법을 자동으로 탐지하고 적용합니다:
| 데이터베이스 | 탐지 방법 | 익스플로잇 기법 |
|---|---|---|
| PostgreSQL | 시간 기반 (pg_sleep) | 시간 기반 블라인드 |
| MySQL | 시간 기반 (SLEEP) | 시간 기반 블라인드 |
| MariaDB | 시간 기반 + @@version_comment | 시간 기반 블라인드 |
| MSSQL | 오류 기반 (CONVERT 실패) | 오류 기반 |
| Oracle | 시간 기반 (DBMS_LOCK.SLEEP) | 시간 기반 블라인드 |
| SQLite | 과도한 쿼리 (카티션 조인) | 시간 기반 (과도한 쿼리) |
| Firebird | 과도한 쿼리 (카티션 조인) | 시간 기반 (과도한 쿼리) |
| DB2 | 과도한 쿼리 (카티션 조인) | 시간 기반 (과도한 쿼리) |
| Informix | 과도한 쿼리 (카티션 조인) | 시간 기반 (과도한 쿼리) |
| H2 | 과도한 쿼리 (카티션 조인) | 시간 기반 (과도한 쿼리) |
| 알 수 없음 (일반) | PostgreSQL로 폴백 | 시간 기반 |
이 프로젝트는 서로 다른 보안 평가 시나리오를 위한 두 개의 Python 스크립트를 제공합니다:
verifier.py – 안전하고 최소한의 검증 도구목적: 데이터를 추출하지 않고 취약점 존재 여부를 신속하게 입증합니다.
수행 작업:
VULNERABLE 또는 NOT VULNERABLE을 보고합니다장점:
사용 사례: 대상이 취약한지 판단하기 위한 1차 평가.
exploit.py – 종합 보안 분석기목적: 취약점을 완전히 활용하여 데이터베이스 정보를 추출합니다.
수행 작업:
장점:
사용 사례: 취약점 확인 후 심층 보안 분석.
주요 차이점:
verifierPoC.py는 취약한지 여부를 알려주고,exploit.py는 무엇을 추출할 수 있는지 보여줍니다. 두 도구는 보안 평가 워크플로에서 서로 다르지만 상호 보완적인 역할을 합니다.
requests 라이브러리pip install requests
두 스크립트 상단에서 다음 변수를 편집하십시오:
| 변수 | 설명 | 기본값 |
|---|---|---|
TARGET | Fineract API URL | http://localhost:8080/fineract-provider/api/v1/offices |
USERNAME | API 인증 사용자 이름 | mifos |
PASSWORD | API 인증 비밀번호 | password |
TENANT_ID | 테넌트 식별자 | default |
BASE_SLEEP | 시간 기반 테스트의 대기 시간 (exploit.py) | 6 |
SLEEP_SECONDS | 시간 기반 테스트의 대기 시간 (verifier.py) | 5 |
TIMEOUT | HTTP 요청 타임아웃 | 25 (exploit) / 15 (verifier) |
MAX_RETRIES | 실패한 요청의 재시도 횟수 | 2 |
exploit.py - 심층 스캔
python3 exploit.py
예상 출력:
CVE-2026-57821 - Apache Fineract Vulnerability Verifier
══════════════════════════════════════════════════════════════════════════════════════
@tc4dy is here :) Good Luck!
CONNECTION SUCCESS
BASELINE: 0.234s
STARTING VULNERABILITY VERIFICATION
VERIFICATION RESULTS
PostgreSQL: VULNERABLE
MySQL: NOT VULNERABLE
MariaDB: NOT VULNERABLE
Oracle: NOT VULNERABLE
MSSQL: NOT VULNERABLE
CONCLUSION: TARGET IS VULNERABLE (CVE-2026-57821 CONFIRMED)
Interpretation: If VULNERABLE appears for any database type, the target is affected.
CVSS 점수 지표 값 CVSS v3.1 기본 점수 8.1 (높음) 벡터 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H 공격 벡터 네트워크 필요 권한 낮음 사용자 상호작용 없음 EPSS 점수
0.29% (30일 이내 익스플로잇 확률)
CWE 매핑
CWE‑89: SQL 명령에 사용되는 특수 요소의 부적절한 중화('SQL 인젝션')
페이로드가 작동하는 이유
Apache Fineract 1.14.0의 취약한 코드:
// Simplified vulnerable logic
String orderBy = request.getParameter("orderBy");
if (ColumnValidator.isValid(orderBy)) {
// VALIDATOR FAILS FOR: "(SELECT ...)"
// Only checks against simple column names
String sql = "SELECT * FROM offices ORDER BY " + orderBy;
// Executes query with user input directly
}
공격자 페이로드 예시:
GET /api/v1/offices?orderBy=(SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)&limit=1
결과 SQL:
SELECT * FROM offices ORDER BY (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)
ColumnValidator는 컬럼 이름을 검사하지만 중첩된 서브쿼리를 놓쳐 임의의 SQL 실행이 가능합니다.
| 조치 | 우선순위 |
|---|---|
| Apache Fineract 1.15.0+로 업그레이드 | 심각 |
| PR #6048 패치 적용 | 심각 |
WAF 규칙: (SELECT, SLEEP(, pg_sleep(, WAITFOR를 포함하는 orderBy 차단 | 높음 |
로그 모니터링: 괄호 또는 서브쿼리 키워드가 포함된 orderBy 감시 | 높음 |
| 데이터베이스 연결 풀 모니터링으로 리소스 고갈 감지 | 중간 |