새소식

정보 보안/웹 해킹

NoSQL Injection

  • -

NoSQL Injection


NoSQL


NoSQL은 비정형 데이터의 저장 필요성 및 빅 데이터의 발달으로 인해 매우 큰 대량의 데이터를 처리하기 위해 등장 했습니다. NoSQL은 단순 검색 및 추가 작업에 있어서 매우 최적화된 키-값 저장 기법을 사용하여, 응답속도나, 처리 효율 등에 있어서 매우 뛰어난 성능을 나타냅니다. 

RDBMS와는 달리 키-값을 사용해 데이터를 사용하며, 여기에서도 RDBMS와 마찬가지로 Injection 공격이 발생할 수 있습니다.

 

MongoDB


MongoDB는 JSON 형태인 Document를 저장하며 아래와 같은 특징을 가지고 있습니다.

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

다음은 RDBMS의 Query와 MongoDB의 Query입니다 둘다 status값이 "TEST"이고 qty 값이 "1"보다 작은 데이터를 조회하는 Query입니다.

RDBMS

SELECT * FROM inventory WHERE status = "TEST" and qty < 1;

MongoDB

db.inventory.find( { $and: [ { status: "TEST" }, { qty: { $lt: 1 } } ] } )

 

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

 

Select

select * from account;
db.account.find()
select * from account where user_id="admin"
db.account.find(
{user_id: "admin"}
)
select user_idx from account where user_id="admin";
db.account.find(
{user_id: "admin"},
{user_idx:1, _id:0}
)

 

Insert

insert into account(
user_id,
user_pw,
) values ("guest", "guest")
db.account.insert({ 
user_id: "guest", 
user_pw: "guest" 
})

 

Delete

delete from account;
db.account.remove()
delete from account where user_id="guest";
db.account.remove( {user_id: "guest"} )

 

Update

update account set user_id="guest2" where user_idx=2;
db.account.update(
{user_idx: 2}, 
{ $set: { user_id: "guest2" } } 
)

Redis

Redis는 키-값(Key-Value)의 쌍을 가진 데이터를 저장합니다. 제일 큰 특징은 다른 데이터베이스와 다르게 메모리 기반의 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"

 

데이터 조회 및 조작 명령어

명령어 구조 설명
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 새로운 설정을 입력

CounchDB

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

 

다음은 각 메소드에 따른 기능 설명이며, HTTP 요청으로 레코드를 업데이트하고, 조회하는 예시입니다.

메소드 기능 설명
POST 새로운 레코드를 추가합니다.
GET 레코드를 조회합니다.
PUT 레코드를 업데이트합니다.
DELETE 레코드를 삭제합니다.
$ 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, 필드는 특수 구성 요소를 나타냅니다. 다음은 각 구성 요소에 대한 설명입니다. 

이 외 자세한 정보는 공식 문서를 통해 확인할 수 있습니다.

 

SERVER

요소 설명
/ 인스턴스에 대한 메타 정보를 반환합니다.
/_all_dbs 인스턴스의 데이터베이스 목록을 반환합니다.
/_utils 관리자페이지로 이동합니다.

 

Database

요소 설명
/db 지정된 데이터베이스에 대한 정보를 반환합니다.
/{db}/_all_docs 지정된 데이터베이스에 포함된 모든 도큐먼트를 반환합니다.
/{db}/_find 지정된 데이터베이스에서 JSON 쿼리에 해당하는 모든 도큐먼트를 반환합니다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.