728x90

NoSQL이란?

NoSQL은 흔히 Not Only SQL의 약자이다. 단어 그대로 뜻을 보면 기존 관계형 DBMS가 가지고 있던 특성뿐만 아니라 더 추가된 특성들을 부가적으로 지원한다고 볼수있다. 우리가 흔히 사용하고있는건 RDBMS형태의 관계형 데이터베이스이다. 그러나 NoSQL은 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미한다. NoSQL제품군은 제품에 따라 특성이 달라 하나의 제품군으로 정의할수없다. 그래도 NoSQL제품군과 RDBMS의 대표적인 차이점을 보자.

  • 일단 데이터 관계와 정해진 규격이 없다.
  • Join과 트랜젝션을 지원하지 않는다.
  • 대다수의 제품이 오픈 소스이다.
  • 대부분 여러 DB서버를 묶어서 하나의 데이터베이스를 구성한다.
  • DB의 서비스가 중단이 없고 자동 복구 기능을 지원한다.

NoSQL의 종류

 

1. Key-Value Store

가장 단순하고 구현하기 쉽다. 데이터가 키와 값의 쌍으로 저장되는데 키는 값에 접근하기 위한 용도로 사용되고 값은 이미지나 비디오를 포함한 어떠한 형태의 데이터도 담을 수 있다. 간단한 API를 제공해서 질의의 속도도 빠른편이다. 그러나 값의 내용을 사용한 쿼리가 불가능하다. 그래서 사용자는 키를 사용해 값을 읽어들이고 어플리케이션 레벨에서 적절히 처리해야 된다. 이를 사용한 NoSQL DB는 Voldemort, Amazon DynamoDB, Riak등이 있다.

 

2. Column family store

이 모델은 여러 서버에 분산된 수많은 데이터를 저장하고 처리하기 위해 만들어졌다. 특이하게 키에서 필드를 결정한다. 그래서 클러스터링이 쉽게 이뤄지고 time stamp가 존재해서 값이 수정된 히스토리를 알 수있다. 그리고 값들은 일렬의 바이너리 데이터로 존재해서 어떠한 형태의 데이터로도 저장될 수 있다. 그러나 Blob단위의 쿼리가 불가능하다. 그리고 Row와 Column의 초기 디자인이 중요하다. Schema-less지만 새로운 필드를 만드는 비용이 많이 들어서 사실상 결정된 schema를 변경하기는 힘들다. 이를 사용한 NoSQL DB는 HBase, Cassandra, Hypertable등이 있다.

 

3. Document DB

기본적으로는 Key-Value Store와 비슷하다. 데이터와 키는 Document형태로 저장된다. 다른점이라면 Value가 계층적인 형태인 Document로 저장된다는 것이다. 각 키마다 nested value를 허락한다. 검색에 최적화 되어있다. 그러나 사용이 번거롭고 쿼리가 SQL이랑은 다르다. 질의의 결과가 JSON이나 xml 형태로 출력되기 때문에 그 사용 방법이 RDBMS에서의 질의 결과를 사용하는 방법과 다르다. 이를 사용한 NoSQL DB는  MongoDB, CouchDB, MarkLogic가 있다.

 

4. Graph DB

실제 세계의 데이타를 관계와 함께 표현하기 위해 디자인된 모델로써, 데이터는 연속적인 노드, 관계, 특성의 형태로 저장된다. 다시 말해 그래프 형태로 저장된다는 뜻이다. 따라서 그래프 모델에서의 질의는 그래프 순회를 통해 이루어진다. 개체와 관계를 그래프 형태로 표현한 것이므로 관계형 모델이라고 할 수 있으며, 데이터 간의 관계가 탐색의 키일 경우에 적합하다. 페이스북이나 트위터 같은 소셜 네트워크에서(내 친구의 친구를 찾는 질의 등) 적합하고, 연관된 데이터를 추천해주는 추천 엔진이나 패턴 인식 등의 데이터베이스로도 적합하다. 또한 집합 지향 모델과는 다르게 개체의 ACID 트랜잭션을 지원한다. 그러나 클러스터링에는 적합하지 않다. 또한 질의 언어도 특화되어 있어 배우기 어렵다. 이를 사용한 NoSQL DB는 Neo4J, InfoGrid, Infinite Graph가 있다.

 

NoSQL Injection

관계형 제약 조건과 일관성 검사 횟수를 줄임으로써 NoSQL 데이터베이스는 성능 및 확장 이점을 제공한다. 그러나 이런 DB는 기존 SQL구문을 사용하지 않아도 주입공격에 잠재적으로 취약할 수 있다. 이러한 NoSQL 주입 공격은 선언적 SQL 언어가 아닌 절차 언어 내에서 실행될 수 있으므로 잠재적 영향은 기존 SQL 주입보다 크다. 현재 150 개가 넘는 NoSQL 데이터베이스가 응용 프로그램 내에서 사용 가능하며 다양한 언어 및 관계 모델로 API를 제공한다. 각각은 다른 기능과 제한을 제공한다. 그것들 사이에 공통 언어가 없으므로 예제 주입 코드는 모든 NoSQL 데이터베이스에 적용되지 않는다. 이러한 이유로 NoSQL 주입 공격을 테스트하는 사람은 특정 테스트를 수행하기 위해 구문, 데이터 모델 및 기본 프로그래밍 언어를 숙지해야한다. NoSQL 주입 공격은 기존 SQL 주입과 달리 응용 프로그램의 다른 영역에서 실행될 수 있다. SQL 인젝션이 데이터베이스 엔진 내에서 실행되는 곳에서는 NoSQL API 사용 및 데이터 모델에 따라 애플리케이션 계층이나 데이터베이스 계층에서 NoSQL 변형이 실행될 수 있다. 일반적으로 NoSQL 주입 공격은 공격 문자열이 구문 분석, 평가 또는 NoSQL API 호출로 연결되는 위치에서 실행된다.

 

NoSQL Injection in MongoDB

MongoDB는 흔히 쓰이고 있는 NoSQL DB이다. 위에서 말했듯이 Document DB이다. 그렇기 때문에 MongoDB API는 BSON(Binary JSON)호출을 기대하고 안전한 BSON쿼리 어셈블리 툴을 포함하고 있다. 그러나 직렬화되지 않은 JSON 및 JavaScript표현식이 여러 대체 쿼리 매개 변수에서 허용된다. 임의의 JavaScript 입력을 허용하는 가장 일반적으로 사용되는 API 호출은 $ where 연산자이다.

 

https://github.com/cr0hn/nosqlinjection_wordlists여기를 보면 쿼리문들을 잘 정리해놨다.

 

 

 SQL Injection

NoSQL Injection 

SELECT * FROM accounts WHERE username = '$username' AND password = '$password'  

 db.accounts.find({username: username, password: password});

SELECT * FROM accounts WHERE username = 'admin' -- AND password = ''

 { "username": "admin", "password": {$gt: ""} }

 

MongoDB에서 $gt는 필드의 값이 지정된 값보다 큰 document를 선택한다. 따라서 위의 명령문은 데이터베이스의 비밀 번호를 빈 문자열과 비교하여 큰것을 나타내며, 이는 참을 반환한다. 동일한 결과는 $ne 와 같은 다른 비교 연산자를 사용하여 얻을 수 있다. 그럼 MongoDB의 연산자를 알아야지 injection할 수 있을 것이다.

 

연산자

설명

$eq

== 

$gt 

$gte 

>= 

$lt 

$lte 

<= 

$ne 

!= 

$in 

주어진 배열에 속하는값

$out 

주어진 배열에 속하지 않는 값 

 

 

 

 

 

 

일단 이렇게 연산자가 있다. 흔히 SQL Injection에서 쓰이는 것들로 쿼리만 맞게 쓰면 될것같다.

 

{"id":{"$ne": 1},"pw":{"$ne": 1}}  

 

$ne는 위에 표처럼 값이 다를때 1을 반환한다. 그러면 위의 쿼리문을 보면 id와 pw가 다를 것이기 때문에 1을 반환할것이고 "$ne": 1과 같이 뒤에 1이랑 비교를 하고있으니 접속이 될것이다.  

 

 

'Hacking > Web Hacking' 카테고리의 다른 글

SSRF  (0) 2018.01.10

+ Recent posts