Lab: Exploiting NoSQL operator injection to bypass authentication
https://portswigger.net/web-security/nosql-injection/lab-nosql-injection-bypass-authentication
연산자를 이용한 NoSQL Injection 취약점
해당 실습은 MongoDB NoSQL 데이터베이스 기반
문제 해결을 위해 administrator 사용자로 애플리케이션에 로그인
자격증명을 사용하여 wiener:peter 로그인 할 수 있음
(1) wiener:peter로 로그인을 합니다.
(2) 로그인 패킷을 확인합니다.
(3) NoSQL Injection 공격 가능여부를 확인합니다.
=> NoSQL Injection 공격 가능
=> 비밀번호 우회 성공
=> $ne를 사용하면 비밀번호가 invalid와 같지 않은 모든 사용자를 추출
(4) $in 연산자로 관리자 이름을 찾습니다.
=> 일치하는 관리자 이름 없음
=> $in을 사용하면 배열에 지정된 모든 값을 일치시킴
(5) $regex 연산자로 정규식을 사용하여 관리자 이름을 찾습니다.
(5)-1 $regex 연산자 사용 가능 여부를 확인합니다.
=> $regex 연산자 사용 가능
(5)-2 관리자로 로그인을 시도합니다.
=> adm으로 시작하는 사용자 이름으로 로그인 성공
(6) 결과 확인
=> (5)-2에서 얻은 session 값을 웹브라우저에서 session value에 삽입
=> 문제 해결 성공
NoSQL 쿼리 연산자
$where JavaScript 표현식을 만족하는 문서와 일치함
$ne 지정된 값과 동일하지 않은 모든 값을 일치시킴
$in 배열에 지정된 모든 값을 일치시킴
$regex 값이 지정된 정규식과 일치하는 문서를 선택함
{"username":"wiener","password":"peter"}
=> 사용자이름, 비밀번호
사용자 이름 입력이 쿼리 연산자를 처리하는지 테스트
{"username":{"$ne":"invalid"},"password":{"peter"}}
=> $ne를 사용하면 사용자 이름이 invalid와 같지 않은 모든 사용자를 추출
사용자 이름과 비밀번호 입력이 모두 연산자를 처리하는 경우 페이로드를 사용하여 인증 우회
{"username":{"$ne":"invalid"},"password":{"$ne":"invalid"}}
=> 사용자 이름과 비밀번호가 모두 invalid와 같지 않은 모든 로그인 정보 반환
계정 타겟팅을 위해 알려진 사용자 이름이나 추측한 사용자이름이 포함된 페이로드 구성
{"username":{"$in":["admin","administrator","superadmin"]},"password":{"$ne":""}}
=> 공격 시도
[참고]
https://portswigger.net/web-security/nosql-injection#nosql-operator-injection