본문 바로가기

드림핵

[드림핵 워게임] NoSQL-CouchDB

<문제>

 

<풀이>

문제 사이트에 접속하면 처음으로 보이는 페이지이다.

 

app.post('/auth', function(req, res) {
    users.get(req.body.uid, function(err, result) {
        if (err) {
            console.log(err);
            res.send('error');
            return;
        }
        if (result.upw === req.body.upw) {
            res.send(`FLAG: ${process.env.FLAG}`);
        } else {
            res.send('fail');
        }
    });
});

로그인 폼에서 받은 값을 처리하는 부분의 코드를 살펴보면

get() 함수를 통해 uid값을 받고 있는데

get() 함수는 전달된 인자에 대해 특수 구성 요소의 포함 여부를 검사하지 않기 때문에 취약점이 있다.

 

[특수 구성 요소]

/

/_all_dbs

/_utils

/db

/{db}/_all_docs

/{db}/_find

 

uid에 _all_docs를 입력하면

데이터베이스에 포함된 모든 도큐먼트를 result로 반환하는데,

키 값이 upw인 데이터를 반환하지 않기 때문에

32행에서 비교하고 있는 result.upw는 undefined가 된다.

 

따라서 req.body.upw를 undefined로 하면

result.upw === req.body.upw가 True가 되어서 FLAG가 출력될 것이다.

 

uid에 _all_docs를 입력하고 upw 값을 비운 채로 Login을 시도했는데

upw 값을 입력해야 한다고 뜬다.

 

개발자도구를 열어서 upw 요소에 있는 required를 제거한다.

 

그런데 fail이 뜬다.

 

개발자도구의 Console 탭에서 document.getElementsByName()으로 upw의 값을 출력해보니

undefined가 아니라 객체로 뜬다.

 

name값을 지워서 upw라는 객체를 찾을 수 없게 했다.

 

다시

uid에 _all_docs를 입력하고

upw에 아무것도 입력하지 않은 채로 로그인은을 했다.

 

flag가 출력되었다.