Lab: Exploiting NoSQL operator injection to bypass authentication

Lab: Exploiting NoSQL operator injection to bypass authentication

https://portswigger.net/web-security/nosql-injection/lab-nosql-injection-bypass-authentication

 

Lab: Exploiting NoSQL operator injection to bypass authentication | Web Security Academy

The login functionality for this lab is powered by a MongoDB NoSQL database. It is vulnerable to NoSQL injection using MongoDB operators. To solve the lab, ...

portswigger.net


연산자를 이용한 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