Level3 : goblin
쿼리문을 보면 id는 guest로 고정이고, no값을 GET 방식으로 가져온다.
아래 if문에서 조회된 id가 있으면 'Hello [id]'가 출력되고, 다음 if문에서 그 id가 admin이라면 문제가 풀린다.
no값을 1로 주었는데 Hello guest라는 값이 나왔다.
쿼리문을 보면 and연산이므로 db안에서도 guest의 no값이 1이기 때문에 문자열이 나타난 것이다.
no값을 2로 준다면 저 문자열은 나타나지 않는다.
admin의 no값은 1이 아닌 모든 수 중에 하나이지만, 이 값을 찾는건 말이 안된다.
그래서 no값은 guest(1)가 아닌 아무 숫자나 넣고, or연산을 통해서 id='admin' 조건을 넣어준다.
?no=2 or id='admin'
이러한 결과가 나올텐데 이는 php코드에서 보면 no에 들어오는 값 중, 몇가지 문자들을 필터한다.
위 코드에서는 싱글 쿼터(')를 필터하므로, id='admin'를 사용할 수가 없다.
db안의 admin계정의 문자를 숫자로 바꿔 조건을 준다면 싱글 쿼터 없이도 조회할 수 있다.
?no=100 or ord(id)=97
ord() 함수는 문자 또는 문자열의 ASCII값을 10진수로 반환한다.
이때, 문자열 값이 들어오면 문자열의 맨 앞 문자만 반환하기 떄문에 ord(admin)을 하면 a의 ASCII코드 값인 97을 반환한다.
GOBLIN Clear