ORM Injection

2024년 11월 16일
3

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 리스트입니다.

LanguageORM
JavaJPA, Hibernate
PythonQuerySet(Django), SQLAlchemy(Flask)
Node.jsSequalize, 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으로 선언하였을 때 취약

# models.py
from django.db import models
 
class MyModel(models.Model):
    #데이터 속성을 Json으로 선언
    data = models.JSONField()
 
    def __str__(self):
        return str(self.data)

HQL Injection

HQL은 Hibernate Query Language의 줄임말입니다.
취약점은 말 그대로 Hibernate에서 HQL을 통해 발생하는 취약점입니다.

아래는 데이터베이스 별 HQL Injection Payload입니다.

DBMSPayload
MySQL'abc\'' INTO OUTFILE -- '
PostgreSQL$$='$$=chr(61)||chr(0x27) and 1=pg_sleep(2)||version()'
OracleNVL(TO_CHAR(DBMS_XMLGEN.getxml('select 1 where 1337>1')),'1')!='1'
MS SQL1<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