admin 권한을 가진 유저를 찾으세요! 유저의 password 가 플래그입니다. 패스워드 형식은 숫자와 알파벳 대소문자, 특수문자 {, }가 포함된 문자열입니다.
admin 유저는 몇 명일까요?
소스분석을 하겠습니다.
db.sql 파일을 열어보니 유저를 insert 한 쿼리문이 나오네요.
11개의 아이디가 있고 비밀번호를 확인할 수 있는건 guest 뿐입니다.
admin도 전부 0으로 되어있는데 이건 뭔지 나중에 확인해 봐야할 것 같습니다.
guest부터 로그인 해보겠습니다.

이렇게 나오네요. 아마 admin 권한이 없을 시 값이 0인 것 같습니다.
mongodb를 사용하였고 main이라는 데이터베이스를 사용하고 있습니다.
코드를 보니 sql injection으로 우회될 수 있을 것 같습니다.
시도해 보겠습니다.
id: admin
pw: 1' OR 1=1 --
로그인 실패..
mongodb는 no sql이니 no sql injection 기법으로 우회를 시도하겠습니다.
1. 빈 객체를 사용하여 모든 upw와 일치하도록 시도 - upw에 {} 입력
2. $ne, $in, $exists 등의 연산자 사용
1, 2번 다 실패.
2번은 될 것 같은데 안되네요.
3. 패스워드 입력란 말고 http post request를 조작하여 넣어보겠습니다.(burp suite 사용)

공격 페이로드
uid=admin&upw[$exists]=true
uid=admin&upw={"regex":".*\\{.*\\}"} uid=admin&upw={"or":[{"ne":"dummy"},{"exists":true}]}
uid=admin&upw={"regex":".*"} uid=admin&upw={"ne":"dummy"}
uid=admin&upw=test&upw=test2
uid=admin&upw=1234&upw=5678
등등
이것도 실패!
아무래도 express.urlencoded() 이게 no sql injection을 방지해 주는 것 같습니다.
잠시 자러 갑니당