문제화면이다.
login에 대한 파라미터가 보인다.
URL에 대입해서 확인해 보자.
음... 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');
일단 Nosql mongo db 인건 알고 있으니 js로 들여다보자.
필터링이 존재한다.
// 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;
}
문자열 'admin', 'dh', 'admi'에 대한 필터링이다.
MongoDB 에서는 정규표현식을 사용할 수 있는 특징이 존재한다.
홈페이지에서는 정규표현식을 사용해서 admin이라는 페이지를 띄울 수 있지만 DH 플래그값을 얻을 수가 없음.
일일이 하려면 오래 걸린다.
정규표현식을 이용 파이썬에서 패스워드를 맞춰보자.
admin 계정의 패스워드 길이는 힌트로 36글자임을 알 수 있다. (DH포함)
실행시간을 줄이긴 위해서는 32글자라고 정하여 패스워드를 찾아보도록 하자.
먼저 영어, 숫자로 구성되어 있기에 string을 이용해서 둘 다 삽입이 가능한 문자열을 만들도록 하자
그다음에는 32글자에 대한 request를 시도하는 것이다.
전부 코딩을 해서 요청을 보내면 플래그 값을 출력해 준다.
'DreamHack > CTF' 카테고리의 다른 글
(CTF 출제)DreamHack - Flying Chars (0) | 2024.05.02 |
---|---|
(CTF 출제)DreamHack - Easy Login (1) | 2024.05.01 |
(CTF 출제)DreamHack - Carve Party (수정) (0) | 2024.04.05 |
(CTF 출제)DreamHack - PHPreg (수정) (0) | 2024.04.05 |
(CTF 출제)DreamHack - ex-reg-ex (수정) (0) | 2024.04.05 |