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를 출력해줬다.

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