[Dreamhack] STAGE6. SQL Injection (4) : Non-Relational DBMS
Web Hacking - NoSQL Injection (1)
Background : Non-Relational DBMS
RDBMS는 스키마를 정의하고 해당 규격에 맞는 데이터를 2차원 테이블 형태로 저장하며, SQL이라는 정해진 문법을 통해 데이터를 저장하기에 한 가지 언어로 다양한 DBMS를 사용할 수 있다. 이는 복잡하며, 저장해야하는 데이터가 많아지는 용량의 한계에 다다를 수 있다는 단점이 있다. 이를 해결하기 위해 등장한 것이 비관계형 데이터베이스이다. NoSQL은 SQL을 사용하지 않고 복잡하지 않은 데이터를 저장하여, 검색 작업에 최적화된 저장공간이다. 또한, 다양한 DBMS가 존재하기에 각각의 구조와 사용 문법을 익혀야한다는 단점이 있다.
MongoDB
MongoDB는 JSON 형태인 문서를 저장하며, 다음과 같은 특징을 지닌다.
- 스키마를 따로 정의하지 않아 각 콜렉션에 대한 정의가 필요하지 않다
- JSON 형식으로 쿼리를 작성할 수 있다
- _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