What's ORM Injection?
ORM Injection은 ORM(Object Relational Mapping)도구에 Injection 하는 공격이다.
해당 취약점은 SQL Injection과 같이 악의적인 SQL문을 사용하여 DB에 접근할 수 있게 된다.
ORM 도구 개발 코드에 취약점이 존재할 때 ORM Injection이 가능해진다.
따라서 공격 대상이 구버전의 ORM을 사용중이라면 ORM Injection 취약점 존재 가능성이 높을 수 있다.
Background
SQL Injection
SQL Injecton은 악의적인 SQL구문을 공격 서비스에 전달하여 서비스에서 사용되는 정상적인 SQL구문의 구조를 변경하여 공격자가 서비스의 데이터베이스에 접근할 수 있는 취약점 입니다.
ORM
ORM은 Object Relational Mapping의 약자로 소스코드의 오브젝트와 데이터베이스의 데이터를 맵핑하여 SQL문을 사용하지 않고 소스코드를 통해 데이터베이스를 관리할 수 있는 도구입니다.
아래는 대표적인 언어별 ORM 리스트입니다.
Language | ORM |
---|---|
Java | JPA, Hibernate |
Python | QuerySet(Django), SQLAlchemy(Flask) |
Node.js | Sequalize, Prisma |
Detection
ORM Injection 취약점이 존재하는지 알기 위해서는 우선 해당 서비스에서 어떤한 ORM을 사용하는지 파악하는게 중요합니다.
ORM의 정보를 확인했다면 해당 ORM의 CVE를 찾아 ORM Injection 공격 가능성 여부를 판단해야 됩니다.
Attack
CVE-2024-42005(Django QuerySet)
비교적 최근에 나온 CVE로 Django의 ORM인 QuerySet에서 ORM Injection 취약점이 발견되었습니다.
취약점은 Django 5.0 ~ 5.0.8, 4.2 ~ 4.2.15 버전의 QuerySet.values()
와 values_list()
에 존재한다고 합니다.
🚫PoC는 악용될 수 있기 때문에 올리지 않았습니다.
Vulnerable Code
모델의 데이터 속성을 JSONField으로 선언하였을 때 취약
HQL Injection
HQL은 Hibernate Query Language의 줄임말입니다.
취약점은 말 그대로 Hibernate에서 HQL을 통해 발생하는 취약점입니다.
아래는 데이터베이스 별 HQL Injection Payload입니다.
DBMS | Payload |
---|---|
MySQL | 'abc\'' INTO OUTFILE -- ' |
PostgreSQL | $$='$$=chr(61)||chr(0x27) and 1=pg_sleep(2)||version()' |
Oracle | NVL(TO_CHAR(DBMS_XMLGEN.getxml('select 1 where 1337>1')),'1')!='1' |
MS SQL | 1<LEN(%C2%A0(select%C2%A0top%C2%A01%C2%A0name%C2%A0from%C2%A0users) |
Reference
https://ufo.stealien.com/2022-12-16/analyzing-django-orm-with-1-day#2-cve-2022-28346
https://www.synacktiv.com/ressources/hql2sql_sstic_2015_en.pdf