문제의 소스코드를 분석해보자
우리가 할 수 있는 건 no 파라미터에 값을 전송하는 것이다.
하지만 preg_match 함수(문자열 체크 함수)를 살펴보면
'(싱글쿼터) 와 "(더블쿼터), `(백쿼터) 를 막고있는 것을 확인할 수 있다.
즉, 우린 쿼터 없이 문제를 풀어야 한다.
no 파라미터를 보면 현재 숫자로 입력받는 것을 알 수 있다.
숫자로 입력을 받는 경우, '(싱글쿼터) 없이 공백으로 no에 들어가는 값을 조절할 수 있다.
?no=1 or id=0x61646d696e %23
no 엔 아무 숫자나 넣고, id가 admin이여야 solve 함수가 실행되므로 id엔 admin 문자열을 넣어줘야 한다.
하지만 id=0x61646d696e 라는 이상한 값을 집어넣어줬다.
이 값은16진수로, string to hex 를 한 것이다.
즉, admin 문자열을 16진수로 바꿔주면 admin = 0x61646d696e가 된다.
16진수로 바꿔준 이유는 우리가 admin을 문자열로 넣기 위해선 싱글쿼터가 필요한데,
싱글쿼터를 사용할 수 없으니 16진수로 넣어준 것이다.
php 코드 안에선 자동적으로 16진수가 형변환을 하여 admin으로 바뀌기 때문에
16진수로 바꾸어줘도 상관이 없다.
URL 뒷부분에 저 코드를 넣고 요청값을 보내면,
무언가 잘못되었다. 분명 id를 admin으로 보냈는데 guest 로 로그인이 된 듯 하다.
쿼리문은 정상적으로 잘 들어갔다.
이것은 no가 1이여서 나타나는 페이지이다.
현재 guest의 no가 1일 때, guest로 로그인이 되는 것을 알 수 있다.
따라서 no를 1이 아닌 -1로 바꿔주면
?no=-1 or id=0x61646d696e %23
admin 정상 로그인이 되며 GOBLIN Clear!