
Strapi의 Content-Type Builder 쓰기 API에서 Knex raw defaultTo를 통한 인증된 SQL 인젝션인 CVE-2026-22599에 대한 Python PoC 및 Docker 실습 환경입니다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · CVE-2026-22599
Strapi 5.33.1 - Strapi
저는 @abraxas_null입니다. 루프백 랩입니다. CVE-2026-22599-Abraxas-Labs.py는 lab/로 chdir한 뒤 run.sh를 실행합니다.
Content-Type Builder 쓰기 API 데이터베이스 쿼리 주입. Yup은 검증하지만 알 수 없는 column.defaultTo를 제거하지는 않습니다. 스키마 빌더는 [value, { isRaw: true }]를 Knex defaultTo(raw())에 병합합니다. 프로덕션에서 CTB 쓰기 API를 숨기는 방식으로 5.33.2 / 4.26.1에서 수정되었습니다.
| CVE | CVE-2026-22599 · CVE.org |
| CWE | CWE-89 |
| CVSS | Critical: 9.3 CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N |
| Product | Strapi |
| Affected | 5.33.1까지(포함)의 모든 버전 |
| Patched | 5.33.2 / 4.26.1 및 이후 버전 |
| Auth | 인증됨 |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 전용 |
인증된 관리자 JWT. 원시 DEFAULT 표현식과 함께 /content-type-builder/content-types에 POST합니다. 해당 타입에 대한 다음 insert는 공격자의 SQL을 사용합니다. 랩 오라클은 셸이 아니라 새로운 labitem 행에 대한 GHSA22599-WITNESS입니다.
저는 createColumn이 attribute.column을 defaultTo 위로 펼치는 부분을 매핑한 뒤, isRaw가 knex raw()를 새니타이즈 없이 호출하는 것을 확인했습니다. Strapi 5.33.1을 구동하고, 관리자를 등록하고, 콘텐츠 타입을 게시하고, 행을 삽입했습니다.
랩에는 이미 실패 제어가 마련되어 있습니다: eval/base64/system은 증거가 아니며, 리버스 셸도 증거가 아니며, 5.33.2는 원시 튜플을 허용해서는 안 됩니다.
포트 18098. Strapi 5.33.1. 관리자 JWT. CTB 쓰기 API 접근 가능(패치 전: 프로덕션에서도). ./run.sh.
오직 127.0.0.1:18098(또는 바인딩한 루프백)만 대상으로 하십시오.
python3 CVE-2026-22599-Abraxas-Labs.py
lab/로 chdir한 뒤 run.sh를 실행합니다(compose up, admin 대기, 그다음 poc.py).
증거: content-manager entry JSON에 GHSA22599-WITNESS가 포함됩니다.
아무것도 배우지 못한 채 실패하는 방법:
Strapi를 5.33.2 / 4.26.1 이상으로 업데이트하십시오. 패치된 빌드에 대해 CVE-2026-22599-Abraxas-Labs.py를 다시 실행하십시오: 원시 DEFAULT가 남아 있어서는 안 됩니다.
github.com/strapi/strapi/security/advisories/GHSA-3xcq-8mjw-h6mx
Abraxas Labs: abraxaslabs.tech · github.com/abraxas · @abraxas_null
GNU Affero GPL v3.0. LICENSE를 참조하십시오.
클라이언트는 루프백과 통신합니다. 소유하지 않은 시스템에 대해 사용하는 것은 Abraxas Labs에 의해 승인되지 않습니다. 보증하지 않습니다.