소학회/Dreamhack

[Dreamhack]NoSQL Injection

도아돵 2023. 11. 8. 15:10

관계형 데이터베이스에서 발생할 수 있는 문제점: SQL Injection

->공격자는 이를 통해 데이터베이스의 정보를 알아내거나 임의의 결과를 반환해 인증을 우회하는 등의 행위가 가능

 

NoSQL 또한 이용자의 입력값을 통해 동적으로 쿼리를 생성해 데이터를 저장하기 때문에 이와 같은 문제점이 발생 가능!!

 

오늘의 목적: 그렇다면 NoSQL의 개념과 어떤 문법을 사용해 데이터를 관리하는지 알아보기

 

RDBMS -SQL을 사용해 데이터를 조회 및 추가 그리고 삭제가능
-S QL이라는 정해진 문법을 통해 데이터를 저장하기 때문에 한 가지의 언어
NoSQL -SQL를 사용하지 않고 복잡하지 않은 데이터를 저장해 단순 검색 및 추가 검색 작업을 위해 매우 최적화된 저장 공간
-Redis, Dynamo, CouchDB, MongoDB 등 다양한 DBMS가 존재하기 때문에 각각의 구조와 사용 문법을 익혀야 함

 

 

[ MongoDB, Redis, CouchDB ]

MongoDB는 JSON 형태인 도큐먼트(Document)를 저장

  1. 스키마를 따로 정의하지 않아 각 컬렉션(Collection)에 대한 정의가 필요하지 않습니다.
  2. JSON 형식으로 쿼리를 작성할 수 있습니다.
  3. _id 필드가 Primary Key 역할을 합니다.

 

 

*컬렉션: 데이터베이스의 하위에 속하는 개념으로, RDBMS의 테이블과 비슷

Comparison

NameDescription

$eq 지정된 값과 같은 값을 찾습니다. (equal)
$in 배열 안의 값들과 일치하는 값을 찾습니다. (in)
$ne 지정된 값과 같지 않은 값을 찾습니다. (not equal)
$nin 배열 안의 값들과 일치하지 않는 값을 찾습니다. (not in)

Logical

NameDescription

$and 논리적 AND, 각각의 쿼리를 모두 만족하는 문서가 반환됩니다.
$not 쿼리 식의 효과를 반전시킵니다. 쿼리 식과 일치하지 않는 문서를 반환합니다.
$nor 논리적 NOR, 각각의 쿼리를 모두 만족하지 않는 문서가 반환됩니다.
$or 논리적 OR, 각각의 쿼리 중 하나 이상 만족하는 문서가 반환됩니다.

Element

NameDescription

$exists 지정된 필드가 있는 문서를 찾습니다.
$type 지정된 필드가 지정된 유형인 문서를 선택합니다.

Evaluation

NameDescription

$expr 쿼리 언어 내에서 집계 식을 사용할 수 있습니다.
$regex 지정된 정규식과 일치하는 문서를 선택합니다.
$text 지정된 텍스트를 검색합니다.

 

 

Redis: 키-값(Key-Value)의 쌍을 가진 데이터를 저장( 메모리 기반의 DBMS )

 

-> 메모리를 사용해 데이터를 저장하고 접근하기 때문에 읽고 쓰는 작업을 다른 DBMS보다 훨씬 빠르게 수행하며  다양한 서비스에서 임시 데이터를 캐싱하는 용도로 주로 사용 중이다.

 

Redis 명령어 공식 문서 : Commands | Redis

 

Commands

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker

redis.io

 

CouchDB는 MongoDB와 같이 JSON 형태인 도큐먼트(Document)를 저장하며  기반의 DBMS로, REST API 형식으로 요청을 처리한다.


[MongoDB를 사용하면서 발생할 수 있는 NoSQL Injection에 대해 알아보기]

 

 

MongoDB의 NoSQL Injection 취약점:

이용자의 입력값에 대한 타입 검증이 불충분할 때 발생
MongoDB:
오브젝트, 배열 타입을 사용가능
오브젝트 타입의 입력값을 처리할 때에는 쿼리 연산자를 사용할 수 있는데, 이를 통해 다양한 행위가 가능하다.

 

문자열이 아닌 타입의 값을 입력할 수 있고, 이를 통해 연산자를 사용할 수 있다 그렇다면, 연산자를 이용해서 어떻게 NoSQL Injection을 수행할 수 있을까 ??

 

이용자의 입력값에 대해 타입을 검증하지 않기 때문에 오브젝트 타입의 값을 입력가능하다.
오브젝트 타입의 값을 입력할 수 있다면 연산자를 사용할 수 있으며 $ne 연산자는 not equal의 약자로, 입력한 데이터와 일치하지 않는 데이터를 반환한다. 
-> 공격자는 계정 정보를 모르더라도 다음과 같이 입력해 해당 정보를 알아낼 수 있다.

 

인증우회이외에도 DB정보 알아낼 수 있는 공격기법:Blind NoSQL Injection
Blind SQL Injection과 같이 참/거짓 결과를 통해 데이터베이스 정보를 알아낼 수 있음


 

Q2. MongoDB는 데이터의 자료형으로 오브젝트와 배열을 사용할 수 있다. ( O )