query = "select id from prob_gremlin where id='{_GET[id]}' and pw='{$_GET[pw]}'";
이 부분을 보면 id 와 pw 둘다 참이어야 한다.
if($result['id']) solve("gremlin");
하지만 아이디만 찾으면 gremlin이 해결된다고 한다.
따라서 id pw 둘 다 참이 되게 하는 쿼리문을 만들어야 한다.
일단 무작위로 id 와 pw를 넣어보았다. id 에는 a 를 pw 에는 1을 넣으니
select id from prob_gremlin where id='a' and pw='1' 로 변했다.
여기서 id 값은 어떠한 값이여도 상관 없으니 pw 를 무조건 참인 값으로 우회해 볼것이다.
id 값에는 아무런 값을 넣고 pw 값에 or 를 사용하여 pw = 1 이거나 1=1이다. 라면 무조건 참이되는 구문이 된다.
이후 아래와 같이 문제를 해결할 수 있다.
중요한 점은 주소창을 보면
첫번째에 입력할때는 ?id=a&pw=1' or '1=1 이었지만 주소로 이동하고 나니
두번째에 입력할때는 ?id=a&pw=1%27%20or%20%271=1 이런식으로 바뀐다.
여기서 알 수 있는 부분은 %27 = ' , %20 = 띄어쓰기라는 것이다.