[WebHacking] NoSQL injection

2022. 3. 1. 22:49

NoSQL 

NoSQL 은 비관계형 데이터베이스를 의미한다. RDBMS는 SQL이라는 정해진 문법을 통해 데이터를 저장하기 때문에 한 가지의 언어로 다양한 DBMS를 사용할 수 있다. 하지만, NoSQL 은 다양한 DBMS가 존재하기 때문에 각각의 구조와 사용 문법을 익혀야 한다. 대표적인 NoSQL은 Redis, Dynamo, CouchDB, MongoDB 등이 있다. 

NoSQL의 대표적인 것들

 

MongoDB

MongoDB는 JSON 형태의 document를 저장한다. $문자를 이용해 연산자를 사용한다는 특징이 있다. 

Comparison

$eq 지정값과 같은 값을 찾는다.
$in 배열 안의 값들과 일치하는 값을 찾는다.
$ne 지정된 값과 같이 않은 값을 찾는다.
$nin 배열 안의 값들과 일치하지 않는 값을 찾는다.

Logical

$and 논리곱. 각각의 쿼리를 모두 만족하는 문서 반환한다.
$not 논리부정. 쿼리 식과 일치하지 않는 문서를 반환한다.
$nor 논리 NOR(Not OR). 각각의 쿼리를 모두 만족하지 않는 문서를 반환한다.
$or 논리합. 각각의 쿼리 중 하나 이상 만족하는 문서가 반환된다.

Element & Evaluation

$exists 지정된 필드가 있는 문서를 찾는다.
$type 지정된 필드가 지정된 유형인 문서를 선택한다.
$expr 쿼리 언어 내에서 집계식을 사용할 수 있다.
$regex 지정된 정규식과 일치하는 문서를 선택한다.
$text 지정된 텍스트를 검색한다.

기본 문법

SELECT db.name.find()
db.name.find({id:"admin"})
DELETE db.name.remove()
db.name.remove({id:"admin"})
UPDATE db.name.update({user_id=2}, {$set : {id:"admin"}}) 

 

 

Redis

Redis는 키-값의 쌍을 가진 데이터를 저장한다. 다른 데이터베이스들과 다르게 메모리 기반이라는 점이 가장 큰 특징이다. 따라서 읽고 쓰는 작업이 다른 DBMS보다 훨씬 빠르다. 그래서 다양한 서비스에서 임시 데이터를 캐싱하는 용도로도 사용된다는 특징이 있다. 

 

Command reference – Redis

 

redis.io

 

CouchDB

MongoDB와 같이 JSON 형태의 document를 저장한다. 웹 기반의 DBMS로 Rest API 형식으로 요청을 처리한다. 

 

 

1. API Reference — Apache CouchDB® 3.2 Documentation

© Copyright 2022, Apache Software Foundation. CouchDB® is a registered trademark of the Apache Software Foundation. Revision cc93da7a.

docs.couchdb.org

 

 

 

NoSQL injection

NoSQL injection은 SQL injection과 공격 목적 및 방법이 매우 유사하다. 두 공격 모두 이용자의 입력값이 쿼리에 포함되면서 발생하는 문제점이다.

https://mobuk.tistory.com/15

 

[WebHacking] SQL Injection

SQL injection SQL injection은 DBMS에서 사용하는 쿼리를 임의로 조작해 데이터베이스의 정보를 획득하는 기법이다. 간단하면서도 정말 많이 일어나는 기법이다. 다음 자료는 OWASP(The Open Web Application Sec.

mobuk.tistory.com

 

특히 MongoDB의 경우 데이터의 입력값에 대한 타입 검증이 불충분할 때 발생한다. 저장되는 데이터의 자료형은 문자열, 정수, 날짜, 실수, 오브젝트, 배열 등이 있다.

 

몽고DB 타입에 관한 공식 문서이다. 

 

$type — MongoDB Manual

Docs Home → MongoDB Manual$type$type selects documents where the value of the field is an instance of the specified BSON type(s). Querying by data type is useful when dealing with highly unstructured data where data types are not predictable.A $type expr

docs.mongodb.com

 

몽고DB를 예시로 설명을 하자.

http:localhost:8000/?data[5678]=1234

data: {'5678','1234'}
type: object

몽고DB는 다음과 같이 사용할 수 있다.

 

http://localhost:8000/query?id[$ne]=a&upw[$ne]=a

만약 위와 같이 입력이 된다면 어떻게 될까? 공격자는 계정 정보를 모르더라도 쿼리문을 참으로 만들어 정보를 꺼내올 수 있다.

 

이렇게 기본적인 원리는 SQL injection과 같지만, 새로운 언어를 학습에 그에 대한 쿼리문을 조작하는 것이 NoSQL injection인 것이다. 

 

아직까지 여기 파트는 설명이 부실하다. 내가 NoSQL을 잘 모르기 때문에 앞으로 채워나가겠다.

BELATED ARTICLES

more