프롤로그
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보다 훨씬 빠르다. (캐싱 용도)
공식 문서 안에 대부분 있다고 함.
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"}
이렇게 쓴다고 함.
이렇다고 하네요.
공식
에필로그
드림핵에서 정확히 어떤 언어를 써서 해킹을 할지는 다음장을 봐야할 것 같음.
결국엔 보안쪽은 모든 분야를 다방면으로 알아야 할 수 있구나;
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] Mango (웹 해킹) (0) | 2024.01.12 |
---|---|
[드림핵/웹해킹] ServerSide: NoSQL Injection (3) | 2024.01.11 |
[드림핵/워게임] simple_sqli -1(웹해킹) (1) | 2024.01.08 |
[드림핵/웹해킹] ServerSide: SQL Injection (0) | 2024.01.07 |
[드림핵/웹해킹] Background: Relational DBMS (0) | 2024.01.07 |