SQL지식 없어도 이력서를 쓸 수 있다 카더라
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도 제외해 보자
답이 나왔다.
코드출처:https://www.hahwul.com/2016/01/12/web-hacking-nosql-injection-mongodb/