본문 바로가기

ETC/EVI$ION

EVI$ION 정규 세션 과제 - #6

Mango

https://dreamhack.io/wargame/challenges/90

 

Mango

Description 이 문제는 데이터베이스에 저장된 플래그를 획득하는 문제입니다. 플래그는 admin 계정의 비밀번호 입니다. 플래그의 형식은 DH{...} 입니다. {'uid': 'admin', 'upw': 'DH{32alphanumeric}'} Reference Serv

dreamhack.io

 

 

 

이러한 화면이 나온다.

일단 로그인 경로 같아보이는 이 경로를 URL 뒤에 붙여보자

 

 

 

guest 계정으로 로그인이 됐다는 표시 같다.

flag가 admin 계정의 비밀번호라고 했으니

일단 admin / admin으로 바꿔서 로그인 해보자

 

당연히 나올리가 없다

 

소스 코드를 보자

 

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

 

일단 admin, dh, admi가 필터링되고 있는 것을 볼 수 있다.

 

 

풀이를 찾아보니

 

uid와 upw가 MongoDB에 들어가는 파라미터이고

uid와 upw를 이용해 NoSQL Injection 공격을 하는 문제라고 한다.

 

일단 MongoDB란...

----------------------------------------------------------------------------------------------------------------

MongoDB는 오픈소스 비관계형 데이터베이스 관리 시스템(DMBS)으로, 테이블과 행 대신 유연한 문서를 활용해 다양한 데이터 형식을 처리하고 저장합니다. NoSQL 데이터베이스 솔루션인 MongoDB는 관계형 데이터베이스 관리 시스템(RDBMS)을 필요로 하지 않으므로, 사용자가 다변량 데이터 유형을 손쉽게 저장하고 쿼리할 수 있는 탄력적인 데이터 저장 모델을 제공합니다. 이는 개발자의 데이터베이스 관리를 간소화할 뿐 아니라, 뛰어난 확장성을 갖춘 크로스 플랫폼 애플리케이션 및 서비스 환경을 구축합니다.

----------------------------------------------------------------------------------------------------------------

NoSQL은 SQL을 사용해 데이터를 조회/추가/삭제하는 관계형 데이터베이스(RDBMS)와 달리 SQL을 사용하지 않으며, 이에 따라 RDBMS와는 달리 복잡하지 않은 데이터를 다루는 것이 큰 특징이자 차이점이다. NoSQL 데이터베이스는 단순 검색 및 추가 작업을 위한 매우 최적화된 저장 공간

----------------------------------------------------------------------------------------------------------------

라고 한다..

 

MongoDB 쿼리 사용 시에는 정규 표현식을 사용해 공격할 수 있다.

 

filter함수가 특정 문자열을 필터링하고 있지만, 정규 표현식에서 임의 문자를 의미하는 "."을 이용하여 우회할 수 있다.  MongoDB의 [$regex] 연산을 사용하면 정규 표현식을 이용해 데이터를 검색할 수 있다.

 

이를 이용해 admin 계정을 조회해보자

 

일단 문제에서 제공한 DH{32alphanumeric}를 통해서 플래그의 길이가 32 임을 알 수 있다.

 

풀이에서 주워온  익스플로잇 코드를 이용해 플래그를 얻어보자.

 

flag_set으로 사용되는  string.digits는 0에서 9 사이의 정수를, string.ascii_letters는 영어 알파벳 대소문자를 의미한다. 플래그가 어떤 문자로 구성되어 있는지를 알아내기 위해 사용한다.

 

 

친절하게 flag를 출력해줬다.

 

 

'ETC > EVI$ION' 카테고리의 다른 글

EVI$ION 7기 정규 세션 과제 - #1  (1) 2024.09.18
EVI$ION 정규 세션 과제 - #7  (0) 2024.05.30
EVI$ION 정규 세션 과제 - #5  (0) 2024.05.16
EVI$ION 러닝 세션 과제 - #4 (5/11)  (0) 2024.05.11
EVI$ION 정규 세션 과제 - #4  (0) 2024.05.09