NoSQL Injection

M200is·2023년 10월 7일
0

Web hacking

목록 보기
2/4
post-thumbnail

NoSQL이란?

Not Only SQL의 약자로 SQL문법을 사용하지 않는 것을 뜻한다. NoSQL DB중 대표적으로 mongoDB가 있다.


SQL지식 없어도 이력서를 쓸 수 있다 카더라

NoSQL Injection

이름 그대로 NoSQL 환경에서의 인젝션 공격이다.

db.myCollection.find( { $where: function() { return obj.credits - obj.debits < USER_INPUT; } } );

다음과 같은 코드가 있다고 하자
여기서 다음과 같은 코드(Date를 받고 무한 반복하는 코드이다.)를 입력하게 되면

USER_INPUT;var date=new Date(); do{curDate = new Date();}while(curDate-date<10000)

코드가 다음과 같이 변해버리게 된다.

function() { return obj.credits - obj.debits < USER_INPUT;var date=new Date(); do{curDate = new Date();}while(curDate-date<10000); }

mongoDB는 세미콜론(';')으로 줄바꿈을 하기 때문에 취약한 코드에 ;을 넣고 원하는 코드를 쓰면 그대로 실행되게 된다.
사실상 SQL Injection과 생김새만 다른 샘이다.

아니면 $ne 등의 구문을 이용해 boolean기반 공격도 가능하다.
boolean 기반 공격의 예시로 rootme의 NoSQL injection - Authentication을 풀어보자

GET으로 로그인 정보와 패스워드를 보낸다,
admin 계정이 있는지 확인해 보기 위해 $ne를 사용해 보자


어드민 계정이 있다. 하지만 우리는 히든 유저의 이름을 알아내야 한다. 그러면 정규표현식으로 admin을 제외한 유저를 찾도록 하면 된다.
정규표현식을 쓸 때 사용하는 쿼리문은 $regex이다.


admin을 제외한 유저로 로그인을 시도해보니. test라는 유저로 로그인이 되었다. 이건 답이 아닌것 같으니 test도 제외해 보자

답이 나왔다.

대처 방법

대처 방법도 SQL Injection과 사실상 같다. 사용자 값을 바로 처리하지 않고 한번 필터링을 거치면 된다.

코드출처:https://www.hahwul.com/2016/01/12/web-hacking-nosql-injection-mongodb/

profile
M200islove

0개의 댓글