
Strapi 인스턴스가 CVE-2026-27886 (인증되지 않은 부울 오라클을 통한 관리자 비밀 정보 유출)에 취약한지 탐지합니다.
전체 계정 탈취 체인을 수행하지 않고 Strapi 인스턴스가 CVE-2026-27886에 취약한지 안전하게 탐지합니다. Bishop Fox 블로그에서 전체 분석 글을 참조하세요.
CVE-2026-27886은 Strapi 버전 4.0.0부터 5.36.1까지에서 발생하는 인증되지 않은 파라미터 정리 우회 취약점으로, 원격의 인증되지 않은 공격자가 공개 Content API를 통해 관리자 비밀정보를 유출할 수 있습니다. @strapi/utils의 쿼리 정리기는 문서화된 filters, sort, fields, populate 쿼리 키만 처리하고, 요청의 다른 모든 최상위 키는 조용히 보존합니다. 알려지지 않은 키는 transformQueryParams를 통해 전달되어 strapi.db.query(...)에 SQL WHERE 절로 도달합니다. 공개 Content API 컬렉션에 대해 where[updatedBy][resetPasswordToken][$startsWith]=<prefix>를 조사함으로써, 공격자는 응답의 meta.pagination.total 필드를 통해 관리자 비밀정보를 한 글자씩 유출할 수 있습니다.
이 도구는 비파괴적 취약점 테스트를 다음과 같이 수행합니다:
GET /api/<collection> 요청 전송GET 요청에 ?where[id][$lt]=-1을 추가하여 전송meta.pagination.total 값을 비교하여 where 절이 데이터베이스 계층에 도달했는지 확인where[id][$lt]=-1 조건은 실제 행과 일치할 수 없으므로, 데이터베이스 계층에서 이 절이 적용되면 응답은 0행으로 줄어듭니다. 패치가 적용된 경우, 알려지지 않은 where 키는 쿼리가 구성되기 전에 정리기의 허용 목록에 의해 제거되며 응답은 기본 요청과 동일합니다. 이 프로브는 비공개 관리자 컬럼에 절대 접근하지 않으며 어떤 데이터도 수정하지 않습니다.
where 절이 데이터베이스 계층에서 적용되었기 때문에 기본 요청은 최소 하나의 행을 반환하는 반면 조건 요청은 0을 반환합니다.sanitizeQuery가 인식되지 않는 모든 최상위 키를 데이터베이스에 도달하기 전에 제거하기 때문입니다.INCONCLUSIVE 결과를 보고합니다.취약한 서버에서 이 도구는 where[updatedBy][email][$startsWith]=<prefix>를 통해 관리자 이메일 주소를 한 글자씩 열거합니다. 관리자 계정 탈취로 연결되지는 않습니다.
git clone https://github.com/BishopFox/CVE-2026-27886-check
cd CVE-2026-27886-check
외부 종속성이 없습니다. 스캐너는 Python 표준 라이브러리 모듈만 사용합니다.
Strapi 서버의 공개 Content API 컬렉션 엔드포인트를 테스트합니다. Strapi는 콘텐츠 유형의 pluralName을 URL 경로에 매핑하므로 정확한 이름은 배포에 따라 다릅니다.
python3 CVE-2026-27886-check.py <ENDPOINT>
$ python3 CVE-2026-27886-check.py http://target.example.com/api/articles
[+] Target: http://target.example.com/api/articles
[+] Differential confirmed: baseline total=1, where-test total=0 -> VULNERABLE
[+] Enumerating admin email
admin email = [email protected]
[+] Done. To remediate, upgrade to Strapi 5.37.0 or later.
$ python3 CVE-2026-27886-check.py http://target.example.com/api/articles
[+] Target: http://target.example.com/api/articles
[+] Differential check: baseline total=1, where-test total=1 -> NOT VULNERABLE
이 도구는 다음 조건이 충족될 때만 취약점을 탐지할 수 있습니다:
find 권한이 부여됨updated_by_id가 NULL이 아님조건이 충족되지 않으면 도구는 INCONCLUSIVE 결과를 보고합니다.
이 코드는 MIT 라이선스 하에 배포됩니다.
사전 상호 동의 없이 이 도구를 대상 공격에 사용하는 것은 불법입니다. 모든 관련 지역, 주, 연방 법률을 준수하는 것은 최종 사용자의 책임입니다. 개발자는 어떠한 책임도 지지 않으며 이 프로그램으로 인한 오용이나 손해에 대해 책임을 지지 않습니다.