Web Hacking - NoSQL Injection (1)

Background : Non-Relational DBMS

RDBMS는 스키마를 정의하고 해당 규격에 맞는 데이터를 2차원 테이블 형태로 저장하며, SQL이라는 정해진 문법을 통해 데이터를 저장하기에 한 가지 언어로 다양한 DBMS를 사용할 수 있다. 이는 복잡하며, 저장해야하는 데이터가 많아지는 용량의 한계에 다다를 수 있다는 단점이 있다. 이를 해결하기 위해 등장한 것이 비관계형 데이터베이스이다. NoSQL은 SQL을 사용하지 않고 복잡하지 않은 데이터를 저장하여, 검색 작업에 최적화된 저장공간이다. 또한, 다양한 DBMS가 존재하기에 각각의 구조와 사용 문법을 익혀야한다는 단점이 있다.

MongoDB

MongoDB는 JSON 형태인 문서를 저장하며, 다음과 같은 특징을 지닌다.

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

MongoDB에서 데이터를 삽입, 조회하는 쿼리의 예시

$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })

> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }

MongoDB 연산자

Comparison
Name Description
$eq 지정된 값과 같은 값을 찾습니다. (equal)
$in 배열 안의 값들과 일치하는 값을 찾습니다. (in)
$ne 지정된 값과 같지 않은 값을 찾습니다. (not equal)
$nin 배열 안의 값들과 일치하지 않는 값을 찾습니다. (not in)
Logical
Name Description
$and 논리적 AND, 각각의 쿼리를 모두 만족하는 문서가 반환됩니다.
$not 쿼리 식의 효과를 반전시킵니다. 쿼리 식과 일치하지 않는 문서를 반환합니다.
$nor 논리적 NOR, 각각의 쿼리를 모두 만족하지 않는 문서가 반환됩니다.
$or 논리적 OR, 각각의 쿼리 중 하나 이상 만족하는 문서가 반환됩니다.
Element
Name Description
$exists 지정된 필드가 있는 문서를 찾습니다.
$type 지정된 필드가 지정된 유형인 문서를 선택합니다.
Evaluation
Name Description
$expr 쿼리 언어 내에서 집계 식을 사용할 수 있습니다.
$regex 지정된 정규식과 일치하는 문서를 선택합니다.
$text 지정된 텍스트를 검색합니다.


Redis

메모리 기반 DBMS로, 읽고 쓰는 작업이 다른 DBMS에 비해 훨씬 빨라, 주로 임시 데이터를 캐싱하는 용도로 사용됨

redis 명령어 예시

$ redis-cli
127.0.0.1:6379> SET test 1234 # SET key value
OK
127.0.0.1:6379> GET test # GET key
"1234"

redis 명령어

데이터 조회 및 조작 명령어
명령어 구조 설명
GET GET key 데이터 조회
MGET MGET key [key …] 여러 데이터를 조회
SET SET key value 새로운 데이터 추가
MSET MSET key value [key value …] 여러 데이터를 추가
DEL DEL key [key …] 데이터 삭제
EXISTS EXISTS key [key …] 데이터 유무 확인
INCR INCR key 데이터 값에 1 더함
DECR DECR key 데이터 값에 1 뺌
관리 명령어
명령어 구조 설명
INFO INFO [section] DBMS 정보 조회
CONFIG GET CONFIG GET parameter 설정 조회
CONFIG SET CONFIG SET parameter value 새로운 설정을 입력


CouchDB

JSON 형태로 문서를 저장하며, 웹 기반의 DBMS로 REST API 형식으로 요청을 처리한다.

메소드 기능 설명
POST 새로운 레코드를 추가합니다.
GET 레코드를 조회합니다.
PUT 레코드를 업데이트합니다.
DELETE 레코드를 삭제합니다.


CouchDB 레코드 업데이트 및 조회 예시

$ curl -X PUT http://{username}:{password}@localhost:5984/users/guest -d '{"upw":"guest"}'
{"ok":true,"id":"guest","rev":"1-22a458e50cf189b17d50eeb295231896"}
$ curl http://{username}:{password}@localhost:5984/users/guest
{"_id":"guest","_rev":"1-22a458e50cf189b17d50eeb295231896","upw":"guest"}

특수 구성 요소

CouchDB는 서버 또는 데이터베이스를 위해 다양한 기능을 제공하며, 그 중 _문자로 시작하는 URL과 필드는 특수 구성 요소를 나타낸다.

CouchDB API : link