보안 스터디/웹 해킹

[드림핵/웹해킹] Background: Non-Relational DBMS

성밍쟁 2024. 1. 11. 13:48
728x90
반응형

프롤로그

simple_sqli 워게임 문제에서 Bilnd SQL Inejction 해볼려고 했는데 안 됐다;

자꾸 requests 모델이 없다는데 파이썬 새 버전 설치에 별 거 다해봤는데 안 돼서 그냥 비관계형 DBMS 로 넘어왔다.

 

 

NRDMBS(NoSQL)

RDBMS의 단점은 저장해야하는 데이터가 많아지면 용량의 한계에 다다를 수 있는 것인데, 이를 해결하기 위해서 나왔다.

RDBMS는 SQL를 사용해 데이터를 조회 및 추가 그리고 삭제할 수 있었는데, NoSQL은 SQL를 사용하지 않고 복잡하지 않은 데이터를 저장해 단순 검색 및 추가 검색 작업을 위해 매우 최적화된 저장 공간이 큰 특징이고 관계형과의 차이점이 있다.

관계형은 SQL이라는 정해진 문법으로 데이터를 저장하기에 SQL이 필수인데, NoSQL은 Redis, Dynamo, CouchDB 등 다양한 DBMS가 존재하기에 각각의 구조와 사용문법을 익여야한다.

 

 

MongoDB

MongoDB는 JSON 형태인 도큐멘트(Document)를 저장함.

- 스키마를 따로 정의하지 않아 각 컬렉션에 대한 정의가 필요하지않음

- JSON 형식으로 쿼리 작성 가능

- _id 필드가 Primary Key역할을 함

위 세 가지 특징이 있음.

$ mongosh
> db.user.insertOne({uid: 'admin', upw: 'secretpassword'})
{ acknowledged: true, insertedId: ObjectId("5e71d395b050a2511caa827d")}
> db.user.find({uid: 'admin'})
[{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }]

이런 예시가 있다고 함.

 

기존 SQL에서 

SELECT * FROM inventory WHERE status = "A" and qty < 30;

이렇게 작성하던 거를 mongoDB 에서는

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

이렇게 된다고 한다.;

그냥 새로운 언어를 다 배우는 느낌이다.

주요 연산자로는

Comparison 비교 
$eq 지정한 값과 같은 값 찾기(equal)
$in 배열 안의 값들과 일치하는 것 찾기(in)
$ne 지정한 값과 같지 않은 값 찾기(not equal)
$nin 배열 안의 값들과 일치하지 않는 값 찾기(not in)

 

Logical 논리
$ and 논리적 AND
$ not 쿼리 식 효과 반전
$ nor 모두 만족하지 않는 거 반환
$ or 하나만 만족

 

Element  
$exists 지정한 필드가 있는 문서 찾기
$type 지정한 필드가 지정된 유형의 문서 선택

 

Evaluation  
$expr 쿼리 언어 내에서 집계 식 사용
$ regex 지정된 정규식과 일치하는 문서 선택
$text 지정된 텍스트 검색

 

 

db.account.find(
  { user_id: "admin" },
  { user_idx:1, _id:0 }
)
db.account.insertOne(
  { user_id: "guest",user_pw: "guest" }
)
db.account.remove(
  {user_id: "guest"}
)
db.account.updateOne(
  { user_idx: 2 },
  { $set: { user_id: "guest2" } }
)

대충 이런식으로 쓴다.

조회 find, 추가 insertOne, 삭제 remove 업데이트 updateOne (이때는 set도 있음)

 

 

Redis

키-값의 쌍을 가진 데이터를 저장. 메모리 기반의 DBMS. 메모리를 사용하여 데이터를 저장하고 접근하기에 다른 DBMS보다 훨씬 빠르다. (캐싱 용도)

 

 

Commands

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

redis.io

공식 문서 안에 대부분 있다고 함.

GET : 조회

SET : 데이터 추가

DEL : 데이터 삭제

EXISTS : 데이터 존재하는가

 

 

CouchDB

MongoDB와 같이 JSON  형태인 Document 저장한다. 웹 기반 DBMS 로 , REST API 형식으로 요청 처리한다.

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"}

이렇게 쓴다고 함.

 

이렇다고 하네요.

공식

 

1. API Reference — Apache CouchDB® 3.3 Documentation

© Copyright 2024, Apache Software Foundation. CouchDB® is a registered trademark of the Apache Software Foundation. Revision 50e1d165.

docs.couchdb.org

 

 

에필로그

드림핵에서 정확히 어떤 언어를 써서 해킹을 할지는 다음장을 봐야할 것 같음.

결국엔 보안쪽은 모든 분야를 다방면으로 알아야 할 수 있구나;

728x90
반응형